7

クエリのパフォーマンスを測定すると、分離レベルと経過時間の間に驚くべき依存関係があることがわかりました。

READUNCOMMITTED - 409024
READCOMMITTED - 368021
REPEATABLEREAD - 358019
SERIALIZABLE - 348019

左の列はテーブル ヒントで、右の列はマイクロ秒単位の経過時間 (sys.dm_exec_query_stats.total_elapsed_time) です。分離レベルを高くするとパフォーマンスが向上するのはなぜですか? これは開発マシンであり、並行性はまったく発生しません。ロックのオーバーヘッドが少ないため、READUNCOMMITTEDが高速になると思います。

更新:これを測定しました

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE  

プロファイラーは、キャッシュ ヒットが発生していないことを確認します。

4

2 に答える 2

5

まず、各分離レベルでクエリを繰り返し実行し、結果を平均して、最大時間のものを破棄する必要があります。これにより、バッファーのウォームアップの影響がなくなります。すべての実行をウォーム キャッシュで実行し、1 つのクエリでキャッシュをウォームアップして、比較してペナルティを支払う必要はありません。

次に、現実的な同時実行シナリオで測定することを確認する必要があります。更新/挿入/削除が実際に発生する場合は、さまざまな分離レベルでの読み取りに多大な影響を与えるため、それらをテストに追加する必要があります。あなたが望む最後のことは、「シリアル化可能な読み取りは最速であり、どこでも使用できます」と結論付けてから、すべてがシリアル化されているため、本番環境でシステムが崩壊するのを見ることです.

それ以外では、ロックを取得しないため、合法的に高速な唯一の分離レベルはダーティ リードです。コミットされたスナップショットの読み取り (測定していません) もロックを取得しませんが、行のバージョン管理のオーバーヘッドにより、全体的なパフォーマンスに影響を与えます。

于 2010-03-15T22:15:16.160 に答える
0

分離レベルをよりよく理解したので、分離レベルを改善すると、スマートな最適化が可能になることがわかりました。たとえば、トランザクションがデータ分離レベルを読み取ると、ディスクからデータを再読み取りしようとするのではなく、最後までそのデータを使用する必要があると規定されている場合があります。

私はまだこれについていくつかの詳細な調査を読むことに興味があります.

于 2012-01-25T23:33:22.410 に答える