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 を生成します。

これが遅い場合、データベースが FULL リカバリ モードにあり、すべての操作がログに記録されていると、速度が低下している可能性があります。

そして、このアプローチがあります。100,000 個の数字を生成し、それぞれに乱数を割り当て、元の数字 - 1 を法としてその乱数を取得します。

with digits as ( 桁として 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 cross join digits d2 cross join digits d3 cross join digits d4 cross join digits d5 ) id として val を選択 (val > 1 の場合は seqnum % (val - 1) end) pid として 'b' from (select *, ROW_NUMBER() over (order by newid()) seqnum from nums ) s

これは私のマシンでは非常に高速に実行されます。差し入れがなければ、数秒で終わりました。

于 2012-12-06T16:13:54.157 に答える