我在 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;
这将始终生成一个小于 id 的 pid。
如果这很慢,如果您的数据库处于完全恢复模式并记录所有操作,您可能会减慢速度。
而且,还有这种方法。生成 100,000 个数字,为每个数字分配一个随机数,然后将该随机数取模原始数 - 1:
数字为(选择0作为数字联合全部选择1联合全部选择2联合全部选择3联合全部选择4联合全部选择5联合全部选择6联合全部选择7联合全部选择8联合全部选择9),数字为(选择(d1.digit*10000+d2.digit*1000+d3.digit*100+d4.digit*10+d5.digit) as val from digits d1 交叉连接数字 d2 交叉连接数字 d3 交叉连接数字 d4 交叉连接数字 d5 ) select val as id, (case when val > 1 then seqnum % (val - 1) end) as pid, 'b' from (select *, ROW_NUMBER() over (order by newid()) seqnum from nums )
这在我的机器上运行得非常快。没有插入,它在几秒钟内完成。