4

SQL-Serverデータベースのテーブルの一部の列 (すべてではない) のすべての値を NULLに設定したいと考えています。問題は、テーブルに30.000.000 を超える行があり、すべての列/行を更新するのに非常に長い時間がかかることです。次の更新ステートメントを高速化するにはどうすればよいですか?

Update Table
Set
column1 = null,
column4 = null,
column8 = null,
column12 = null

テーブルを落とすことはできません!

4

4 に答える 4

6

問題は、テーブルに30.000.000を超える行があり、すべての列/行を更新するのに非常に長い時間がかかることです。次の更新ステートメントを高速化するにはどうすればよいですか?

より高速なサーバーを購入します。

真剣に。

テーブルを削除できません。1つのステートメントで3000万行を更新する必要があります。

それは不変の両面です。可能な最適化はそれほど多くありません(そのフィールドのインデックスを削除してから再作成することができます)。残っているのは、より良いハードウェアを手に入れることです。

申し訳ありませんが、これ以上の答えはありません。ループで一度に10000の更新を試すことができます。これにより、トランザクションとステートメントが高速になりますが、操作全体が高速になるとは思えません。これについての質問です。最後に作業を行う必要があります。より速く行う必要がある場合は、より多くの電力=より高速なサーバーが必要です。

于 2013-01-24T09:55:14.223 に答える
5

列がテーブルの最後にある場合、または列の順序が適切でない場合、列を削除して再度作成するのが最も速い方法だと思います

-- assumes no constraints defined on the columns
alter table MyTable
  drop column Column1, Column2, ... 

alter table MyTable
  add column Column1 int null, Column2 varchar(max) null, ... 

さらに、一般的に更新が遅い場合は、インデックスが過剰に作成されている可能性があります。テーブルに定義されているインデックス、インデックスの数、参照している列などを確認してください。一般に、インデックスが定義されていると、挿入と更新が遅くなります。ただし、選択ははるかに高速になる可能性があるため、すべてのインデックスにアクセスして削除するのではなく、めったに使用されない、またはまったく使用されないインデックスを見つけるようにしてください。

最後に、データベースのインデックスが適切に作成されていても遅すぎる場合は、TomTom の回答をご覧ください。

編集:

SQL Server テーブルの列の順序に関するコメントに対処するには、ほとんどの場合、まったく重要ではありませんが、維持する必要があるシナリオはほとんどありません。

  • 一部のスキーマ比較ツールは順序を重要と見なし、データベース構造の変更を報告する場合があります
  • DBA は大雑把であり (そして私もそうです)、ModifiedByおよびModifiedOn列がテーブルの最後の 2 列ではない場合、頭を悩ませます。
于 2013-01-24T09:55:46.900 に答える
1

役立つ可能性のある別のアプローチは、更新を実行する前にこれらのフィールドで使用されているすべてのインデックスを無効にし、後でそれらを再構築することです。これにより、I/Oオーバーヘッドの一部が排除されます。

2番目のオプションは、テーブルから新しいテーブルにすべてのデータを選択し、必要に応じてnullを列に置き換えることです。次に、最初のテーブルを切り捨て、ID挿入を有効にして、新しいテーブルから最初のテーブルに戻るすべてを選択します。これは、インデックスを無効にすることからも恩恵を受けます。

于 2013-01-24T10:00:54.970 に答える
1

WHERE を指定しない UPDATE は、列に既に NULL がある行も含め、すべての行を更新しようとします。このような一見無意味なフィルターは、大きな影響を与える可能性があります

UPDATE Table
SET
    column1 = null,
    column4 = null,
    column8 = null,
    column12 = null
WHERE
    column1 IS NOT NULL    OR    
    column4 IS NOT NULL    OR     
    column8 IS NOT NULL    OR    
    column12 

または、ディストリビューションによっては、おそらくより良いでしょう:

UPDATE Table    SET    column1 = NULL WHERE    column1 IS NOT NULL     
UPDATE Table    SET    column2 = NULL WHERE    column2 IS NOT NULL     
UPDATE Table    SET    column4 = NULL WHERE    column4 IS NOT NULL     
UPDATE Table    SET    column8 = NULL WHERE    column8 IS NOT NULL     
UPDATE Table    SET    column12 = NULL WHERE    column12 IS NOT NULL     

それでも時間がかかりすぎる場合は、いずれかのソリューションで top (10000) を使用してみて、完了するまで繰り返します。

UPDATE top (10000) Table    SET    column1 = NULL WHERE    column1 IS NOT NULL 
etc...
于 2013-01-24T10:16:15.397 に答える