Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
SQL Serverでは、ロックのリソースが多くなると、
ロック エスカレーションという処理が走り、ロックの粒度を、
『行』 ⇒ 『ページ』 ⇒ 『テーブル』
と大きくすることで、ロックリソースの削減を図り、全体のパフォーマンスを改善しようとする。
問題 †
SQL Serverでは、ユーザ プログラムの処理で使用できる、最も低い分離レベルである、コミット済み読み取り(Read Committed)を適用した場合でも、
参照処理で一時的なロック(共有ロック)を適用するため、参照処理が、大量の行ロックを獲得する場合は、ロック エスカレーションが発生する可能性がある。
- ロック エスカレーションは、パフォーマンス改善に繋がるが、
ロックの粒度が大きくなるため、同時実行性の観点からは問題がある。
- ロック エスカレーションに起因するデッドロックなどが、
多くのプロジェクトで問題として報告されている。
対策 †
ここでは、
- ロック エスカレーション発生の閾値
- ロック エスカレーション発生抑止方法
- ロック エスカレーションを抑止した際に発生する問題
の3点について説明する。
ロック エスカレーション発生の閾値 †
ロック エスカレーション発生の閾値は、具体的には次のような数値をベースにしている。
※ ただし、この閾値はベースとなる値を示すだけであり、実際は統計情報に左右される。
- トランザクションで獲得しているロック数が 1250 を超え、かつ 1250 の整数倍である場合、以下の判定処理が実行される。
- クエリ内部で特定のスキャンで保持するロック数が 4845 を超える場合、エスカレーションが試行される。
- ロックに使用しているメモリ量が、現在使用しているメモリ(AWE領域を除く)のx% に達している場合、ロック エスカレーションが試行される(メモリは、ロック1 つにつき 96 byte を消費する)。
- SQL Server 2000では24%、SQL Server 2005、2008では40%である。尚、これらの数値はバージョンアップ等により予告なく変更されることがある。
ロック エスカレーション発生抑止方法 †
トレース フラグ 1224 or 1211 を有効にして、ロック エスカレーションを無効にすることもできる。
ただし、トレース フラグ1211でロック エスカレーションを無効にした場合、下記の問題が発生するため、推奨はできない。
ロック エスカレーションを抑止した際に発生する問題 †
トレース フラグ1211でロック エスカレーションを抑止した場合、
ロックリソースの不足に起因する『エラー1204』が発生する可能性がある。
- 『エラー1204』の発生の閾値は、以下のようになっている。
- SQL ServerのLocksオプションでロック数を明示的に指定している場合はその数に達した場合。
- デフォルトの動的設定の場合は、ロックに使用しているメモリ量が、
現在使用しているメモリ(AWE領域を除く)の x% に達した場合。
- SQL Server 2000では60%である。尚、これらの数値はバージョンアップ等により予告なく変更されることがある。