我在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)
由于子查询,您的查询非常慢,必须在每次迭代中对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
这在我的机器上运行得非常快。没有插入物,它会在几秒钟内完成。