2012-10-20 68 views
4

我有要求inserting enormous data in table of firebird database around 40K entries。我准备好了我的脚本,但是在使用flameRobin执行它的过程中,UI在永远插入如此庞大的数据时永远都会挂起。使用isql对Firebird数据库运行多个插入查询

我知道这将是罚款,如果我执行我的插入查询块255查询,但我想知道是否有任何bulk insert tool available for Firebird做这样的条目,而从我的scripts.sql文件读取。

一些google搜索后,我碰到isql的工具,但不能反对执行脚本。有人可以指导我使用任何其他工具或正确的文档来一次性输入如此庞大的数据吗?

我已经安装在系统上firebird version 2.5

+0

关于使用'isql' - 为什么你“无法对它执行脚本”?窦你得到一个错误?如果是这样,那么错误信息是什么? FB附带的'isql'是FB的官方“命令行界面”,通常它工作正常。顺便说一句,在每个1000条语句之后添加'COMMIT WORK;'语句到你的脚本中,看看它是否有所作为。 – ain

+0

我刚刚用3-4'insert'查询,它工作正常。但使用'40K'插入查询似乎会挂起。我按照这个问题的方法在这里 - http://stackoverflow.com/questions/5821562/executing-a-script-using-isql。适用于2-3个查询,但不适用于如此庞大的数据。 :( –

+0

添加'COMMIT WORK;'声明每1000'insert'陈述或等以后看这有区别 – ain

回答

4

40K对我来说似乎不是一个大数字。在我们的案例中,我们处理了数百万条记录,没有出现重大问题我认为hunging的原因是Flamerobin试图解析整个脚本或类似的东西。改为使用isql实用程序。首先,准备用命令的文本文件:

CONNECT "your_server:your_database_name" USER "sysdba" PASSWORD "masterkey"; 
INSERT ... ; 
INSERT ... ; 
.... 
INSERT ... ; 
EXIT; 

然后在DOS提示符下运行的实用程序:

isql < your_script.sql 

还要考虑停用指数和删除外键的表批量插入操作之后恢复它们。

+0

我试过这个小数据,但每次我在提示符运行这个消息 - '使用CONNECT或CREATE DATABASE指定一个数据库'。但是当我检查我的数据库时,请输入您的电子邮箱地址 –

+0

编号对我来说很好,我可以给你发一个小型数据库和一个脚本 –

+0

我刚刚测试过我的脚本,在10-12分钟后,出现,但是当我检查数据库时,那里的条目。所以,只要我得到输出信息并不重要,非常感谢。 –

6

您可以使用EXECUTE BLOCK到更多的东西插入到一个单独的语句。类似这样的:

set term !! ; 
EXECUTE BLOCK AS BEGIN 
    insert into ... values ...; 
    insert into ... values ...; 
    insert into ... values ...; 
    insert into ... values ...; 
    ....etc. 
    insert into ... values ...; 
END!! 

您可以将它们分组为100,一次或类似。这应该让事情变得更快,同时也改善了FlameRobin的解析。

ISQL仍然较快,但是这给你更好的误差控制。如果中间的某些插入操作失败并且isql失败,那么很难调试这些东西。

0

您可以使用EXTERNAL

command.CommandText = @"CREATE TABLE TEMP1 EXTERNAL FILE 'c:\ExternalTables\Ext.ext'(ID INTEGER,CRLF CHAR(2));"; 
int j=command.ExecuteNonQuery();