我對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;
它執行非常緩慢。有可能做同樣的事情但速度更快嗎? 謝謝。
我對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;
它執行非常緩慢。有可能做同樣的事情但速度更快嗎? 謝謝。
由於子查詢,您的查詢非常慢,必須在每次迭代中對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
這將運行相當快我的機器上。沒有插入,它在幾秒鐘內完成。
「你的查詢真的很慢,因爲子查詢必須在每次迭代時對table_name進行隨機排序。」 – user1733773
我改變了(從TABLE_NAME命令中選擇頂部的1個ID,由NEWID())來鑄造(rand()* @i作爲int),但是它不會加速腳本 – user1733773
Microsoft SQL Server 2012 - 11.0.2100.60(X64) – user1733773
你想做什麼? –
@MahmoudGamal我試圖生成與層次結構的表,其中pid是parent_id,引用編號爲 – user1733773
但問題是如何在表中插入很多行,然後在我的腳本中。) – user1733773