議論のために、SQL 2005/8 用としましょう。SELECT
ステートメントを調整するためにテーブルにインデックスを配置する場合、これらのインデックスはINSERT
/ UPDATE
/DELETE
アクション中に維持する必要があることを理解しています。
私の主な質問はこれです:
SQL Server がテーブルのインデックスを維持するのはいつですか?
私は多くのその後の質問があります:
コマンドが実行された後にそうすると単純に思います。20 行を挿入するとします。20 行が挿入されてコミットされた後、インデックスは維持されます。
スクリプトがテーブルに対して複数のステートメントを備えているが、それ以外は別個のステートメントである場合はどうなりますか?
サーバーには、すべてのステートメントが実行された後にインデックスを維持するインテリジェンスがありますか?それとも、ステートメントごとに行いますか?
INSERT
大規模な/多くの/UPDATE
アクション の後にインデックスが削除され、再作成される状況を見てきました。
ほんの一握りの行しか変更しない場合でも、これはおそらくテーブル全体のインデックスを再構築することになりますか?
多くの小さな挿入を行うのではなく、行を収集して一時テーブルに挿入するなど、より大きなバッチに照合
INSERT
して アクションを実行しようとすると、パフォーマンス上の利点はありますか?UPDATE
- 上記の行を照合することは、インデックスを削除することとメンテナンス ヒットを取得することに対してどのように積み重なるでしょうか?
質問が増えて申し訳ありません - これは私がいつも気をつけていることですが、スクリプトを調整してバランスを取ろうとすると、インデックスのメンテナンスがいつ行われるのか実際にはわかりません。
編集:パフォーマンスの問題は、挿入/更新中のデータ量とインデックスの数に大きく依存することを理解しています。繰り返しますが、議論のために、次の 2 つの状況があります。
- 選択用に調整されたインデックスの重いテーブル。
- インデックスライトテーブル(PK)。
どちらの状況でも、大きな挿入/更新バッチ、たとえば 10,000 行以上が発生します。
編集 2:データ セットで特定のスクリプトをプロファイリングできることを認識しています。ただし、プロファイリングでは、特定のアプローチが別のアプローチよりも高速である理由はわかりません。私は、インデックスの背後にある理論と、パフォーマンスの問題が発生する場所に興味があり、「これはそれよりも速い」という決定的な答えではありません。
ありがとう。