插入循环

时间:2012-12-06 13:15:58

标签: sql sql-server performance insert while-loop

我在SQL SERVER上有一个脚本:

while (@i < 100000)
begin
  insert into TABLE_NAME (id, pid, value)
    values (@i
          , (select top 1 id from TABLE_NAME order by NEWID())
          , 'b')
  set @i += 1;
end;

执行速度很慢。是否可以做同样但更快? 感谢。

1 个答案:

答案 0 :(得分:0)

由于子查询,您的查询非常慢,必须在每次迭代中对table_name进行随机排序。

您可以使用rand()

执行此操作
while (@i < 100000)
begin
  insert into TABLE_NAME (id, pid, value)
    select @i, 
           cast(rand() * @i as int) as pid,
           'b'
  set @i += 1;
end;

这将始终生成小于id的pid。

如果速度很慢,如果您的数据库处于完全恢复模式,则可能会减慢速度,记录所有操作。

然后就是这种方法。生成100,000个数字,为​​每个数字分配一个随机数,然后将该随机数模数为原始数字 - 1:

以数字为(         选择0作为数字联合全部         选择1联合全部         选择2联盟全部         选择3联盟全部         选择4联盟全部         选择5联盟全部         选择6联盟全部         选择7联盟全部         选择8联盟全部         选择9        )        nums as(            选择(d1.digit * 10000 + d2.digit * 1000 + d3.digit * 100 + d4.digit * 10 + d5.digit)作为val            从数字d1交叉连接                 数字d2交叉连接                 数字d3交叉连接                 数字d4交叉连接                 数字d5          )     选择val作为id,            (当val> 1然后seqnum%(val - 1)结束时的情况)作为pid,'b'     从(选择*,                  ROW_NUMBER()结束(由newid()命令)seqnum           来自nums          )s

这在我的机器上运行得非常快。没有插入物,它会在几秒钟内完成。