2012-12-06 186 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