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;

它执行起来真的很慢。是否可以做同样的事情但更快?谢谢。

4

1 回答 1

1

由于子查询,您的查询真的很慢,必须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 )

这在我的机器上运行得非常快。没有插入,它在几秒钟内完成。

于 2012-12-06T16:13:54.157 回答