0

昨日、次の行に沿って update ステートメントを実行しました。

UPDATE MainTable
Set SomeField = SubsetTable.SomeField
where MainTable.MainTableKey = SubsetTable.MainTableKey

ここで、SubsetTableは のサブセットでMainTableあり、同じ主キー フィールドを持ちます。MainTableおよそ 2 億件のレコードがあり、 SubsetTable500 万件のレコードがあります。MainTableKeyGUID です。

これらのテーブルの両方に、クラスター化インデックスがありMainTableKeyます。

このクエリを初めて実行したとき、なんと 14 時間かかりました。

MainTableKey次に、両方のテーブルに非クラスター化インデックスを追加しました。今では30分かかります。

なぜパフォーマンスの向上がそれほど劇的になるのかについて、誰か考えがありますか?

4

1 に答える 1

1

実行計画を見ればきっと:

最初のクエリは、両方のテーブルを完全に読み取るマージ結合です。

200M rows + 5M rows = 205M rows.
205M rows / 14 hours = 4067 rows per second.

2 番目のクエリは、小さなテーブル全体を読み取り、小さなテーブルの行ごとに大きなテーブルをシークする入れ子になったループ結合です。

5M + 5M rows = 10M rows.
10M rows / 40 minutes = 4166rows per second.

これらのレートがほぼ等しいということは、どの行が読み取られるかについての私の理論を裏付けています。

推測する必要はありません。 でクエリを実行するSET STATISTICS IO ONか、実行計画を確認してください。

于 2012-05-11T13:59:11.653 に答える