web-dev-qa-db-ja.com

ALLOW_SNAPSHOT_ISOLATIONがOFFのときにREAD_COMMITTED_SNAPSHOTをONに設定する

SQL Serverデータベースのさまざまな構成を試し、最終的にREAD_COMMITTED_SNAPSHOT to ON while ALLOW_SNAPSHOT_ISOLATIONOFFです。

これを有効にすると、多くのクエリが大幅に速くなることに気付きました。私はまだデフォルトを使用していますREAD COMMITTEDデータベースに接続するための分離レベル。

実際にここで何が起こっているのでしょうか?ALLOW_SNAPSHOT_ISOLATIONOFFで、設定READ_COMMITTED_SNAPSHOT to ONは効果がありません...私はまだ実際にスナップショットアイソレーションを使用していません、または私ですか?誰かが説明してくれませんか?よくわかりません。

このトピックをオンラインで調べてみましたが、いつでもREAD_COMMITTED_SNAPSHOTが使用されているため、常にALLOW_SNAPSHOT_ISOLATION、有効にしませんでした。

5
Tom Pažourek

これを有効にすると、多くのクエリが大幅に速くなることに気付きました。私はまだデフォルトを使用していますREAD COMMITTEDデータベースに接続するための分離レベル。

ダン これに注意:

オプションは独立しており、両方をオンにする必要はありませんが、多くは誤ってオンにします。どちらかをオンにすると、行のバージョン管理のオーバーヘッドが発生します。 READ_COMMITTED_SNAPSHOT ONはすべてを引き起こすREAD_COMMITTEDセッションをロックする代わりに行のバージョン管理を使用することで、ブロックを回避し、パフォーマンスの向上を認識できるようにします。

加えて、 READ_COMMITTED_SNAPSHOT(以降、RCSIと呼ばれます)は、楽観的同時実行のいくつかのプロパティのみを提供します。 RCSIとスナップショット(SI)は、主に3つの点で異なります。

  1. RCSIは、すべてのRC分離クエリですぐに使用されます。
  2. RCSIは、単一のステートメントのデータベースのポイントインタイム(スナップショット)ビューを提供します。
  3. SIは、トランザクション全体の特定時点のビューを提供します。
  4. SIは書き込みの競合が発生する可能性があります。

ここで実際に何が起こっていますか?

RCSIがオンになっているため、すべてのRC分離クエリがRCSIに昇格され、リーダーはライターをブロックせず、ライターはリーダーをブロックしません。表示されている「スピードアップ」は、ブロックと待機の代わりにオプティミスティック並行性のバージョンストアを使用しているため、これらのクエリのブロックの待機が減少したことが原因であると考えられます。これにより、クエリで望ましい結果が得られる場合と得られない場合があります。

ALLOW_SNAPSHOT_ISOLATIONOFFで、設定READ_COMMITTED_SNAPSHOT to ONは効果がありません...私はまだスナップショットアイソレーションを実際に使用していませんか、それとも私ですか?

上記を参照。 RCSIがオン(実際にオンにしたもの)のときに使用していますが、SIはオンのときに自動的には使用されません。明示的にSET TRANSACTION ISOLATION LEVEL SNAPSHOT(または同等のもの)を使用してSI。


詳細については、製品ドキュメントの SQL Serverデータベースエンジンの行バージョン管理ベースの分離レベル を参照してください。

RCSI/SIを使用する際の注意点と警告に関するその他の有用な詳細については、次の記事を参照してください。

4
Gavin Belson