2012-12-06 144 views
1

我对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; 

它执行非常缓慢。有可能做同样的事情但速度更快吗? 谢谢。

+0

你想做什么? –

+0

@MahmoudGamal我试图生成与层次结构的表,其中pid是parent_id,引用编号为 – user1733773

+0

但问题是如何在表中插入很多行,然后在我的脚本中。) – user1733773

回答

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; 

这总是会生成一个PID小于ID。

如果速度很慢,如果数据库处于FULL恢复模式并记录所有操作,则可能会降低速度。

然后,有这种方法。产生10万个的数字,分配一个随机数,以每一个,然后采取随机数模原号 - 1:

以数字为( 选择0作为数字UNION ALL 选择1个UNION ALL 选择2 UNION ALL 选择3 UNION ALL 选择4 UNION ALL 选择5 UNION ALL 选择6 UNION ALL 选择7 UNION ALL 选择8 UNION ALL 选择9 ) NUMS如( 选择(d1.digit * 10000 + D2。数字* 1000 + d3.digit * 100 + d4.digit * 10 + d5.digit)作为val 从数字D1交叉联接 数字D2交叉联接 数字D3交叉加入 位数D4交叉加入 位D5 ) 选择VAL为ID, (情况下,当值> 1,则SEQNUM%(VAL - 1)端)作为PID, 'b' 从(选择*, ROW_NUMBER()OVER(由NEWID())SEQNUM 从NUMS 顺序)S

这将运行相当快我的机器上。没有插入,它在几秒钟内完成。

+0

“你的查询真的很慢,因为子查询必须在每次迭代时对table_name进行随机排序。” – user1733773

+0

我改变了(从TABLE_NAME命令中选择顶部的1个ID,由NEWID())来铸造(rand()* @i作为int),但是它不会加速脚本 – user1733773

+0

Microsoft SQL Server 2012 - 11.0.2100.60(X64) – user1733773