我写了一个可行的脚本,但它非常慢(6小时)。我的任务是创建10000条记录,每条记录随机(随机)最多50个终结条,每条记录随处(随机)最多50个相关的外键项,然后再一次又一次。
我认为这是非常缓慢的,因为我正在做的迭代方式。
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 :(得分:1)
哪个数据库品牌?
如果你的数据库支持它,你应该使用批量复制。
如果您无法进行批量复制,请尝试
insert into some_table (columns...) values
(some values...),
(some values...),
...
(some values...);
您还可以禁用自动提交,并且只在最后提交事务。
如果您可以在插入之前删除/禁用索引,触发器,约束,键并在之后重新启用它们,它也会更快。
您可能希望先插入外部(引用)表。
MS SQL Server:http://msdn.microsoft.com/en-us/library/ms188365.aspx
PostgreSQL:http://www.postgresql.org/docs/9.3/static/sql-copy.html
Oracle:https://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm
答案 1 :(得分:0)
尽管我认为6小时是插入12.5亿行的短时间,您可以尝试以下
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)