2014-12-06 47 views
0

我已经写了一个可以正常工作的脚本,但它非常慢(6小时)。我一直负责创建10000条记录,每条记录随机地(随机)多达50个enditems,每个记录随机地(随机)最多50个相关的外键项目,然后再一次和重复。创建大量的测试数据sql

我觉得这是非常缓慢的,因为我这样做的迭代方式。

Loop 10000 
insert into tble1() 
Loop 50 
    insert into tble2 (select top(1) from tble1 desc) 
    Loop 50 
    insert into tble3 (select top(1) from tble2 desc) 
    Loop 50 
    insert into tble4 (select top(1) from tble3 desc) 
    end 
    end 
end 
end 

是怎么样的。我知道sql最好与集合而不是迭代,但有没有办法做到这一点与没有这种循环设置我有?

+0

这就是2500万行,我会让它在一夜之间运行6个小时,并在第二天使用它。 – 2014-12-06 21:17:39

+1

其实它是12.5亿行6小时很不错 – 2014-12-06 21:18:47

+0

是的,我知道我正在处理大量数据,但方法是否做得太慢?我真的不确定我能做到但除此之外。我对SQL非常陌生,并且正在以一种集思路而不是传统的迭代过程进行开发。 – Adola 2014-12-06 21:19:12

回答

1

哪个数据库品牌?

如果你的数据库支持它,你应该使用批量复制。

如果你不能做到批量复制,尝试

insert into some_table (columns...) values 
(some values...), 
(some values...), 
... 
(some values...); 

您也可以禁用自动提交,只在最后提交事务。

如果您可以在插入之前删除/禁用索引,触发器,约束,键,并在之后重新启用它们,那么速度也会更快。

您会希望首先插入到外部(引用)表中。

MS SQL服务器:http://msdn.microsoft.com/en-us/library/ms188365.aspx

的PostgreSQL:http://www.postgresql.org/docs/9.3/static/sql-copy.html

甲骨文:https://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm

+0

我正在查看批量插入。除非我正在阅读错误的文档,否则我必须已经创建了正确的数据?我必须随机生成所有这些数据。至于你的例子,这就是我目前的做法。但删除索引可能是一个想法,我还没有尝试过。 – Adola 2014-12-06 21:24:56

+0

你的剧本在哪里?例如,在JDBC + Postgres中,您可以使用CopyManager(内部使用COPY)将数据流发送到数据库。或者你可以写入临时CSV文件 – 2014-12-06 21:26:21

0

我们会尽管我认为6小时是一个相当短的时间内插1.25十亿行,你可以试试以下

Loop 10000 
Insert into table 

    Insert into table (select 50 from temp table where Id like x) 
    Loop 50 
    Insert into table (select 50 from temptable2 where id > something else)