1

SQL Server 2012を使用すると、700万行のテーブルがあります。PK列はGUID(COMB GUID)です。クエリのパフォーマンスをテストしようとしていますが、最初にデータのランダムサンプリングを更新する必要があり、50,000行の列値(PKではない)を変更したいと思います。

NEWID()で上位50,000の順序を選択するには時間がかかりすぎるため、SQLServerがテーブル全体をスキャンしていると思います。TABLESAMPLEの構文が正しくないようです。空のセットが返されます。

これを機能させるための最良の方法は何ですか?

4

1 に答える 1

3

そしてそれをアップデートとして扱うには:

;WITH x AS
(
  SELECT TOP (50000) col 
  FROM dbo.table TABLESAMPLE (50000 ROWS)
)
UPDATE x SET col = 'something else';

しかし、いくつかの注意事項:

  1. おそらく、パフォーマンスが大幅に向上することはありませんORDER BY NEWID()。1MM行のテーブルでは、これは私のマシンでは1分以上かかりました。
  2. TABLESAMPLEは正確な行数を保証しないため、TOPがあります。これは、50,000行を含む可能性のあるページ数の大まかな計算に基づいています。フィルファクター、可変長列の数、NULL値の数などに応じて、最終的には少なくなる場合と多くなる場合があります。上記のTOPは、見積もりによって読み取られるページ数が増える場合に、50,000に制限するのに役立ちます。見積もりが下回っている場合は役に立ちません。

現在、別の質問でこれが起こっているという議論があります。

于 2012-05-23T18:58:54.063 に答える