web-dev-qa-db-ja.com

パーティションレベルのロックエスカレーションがデフォルトではないのはなぜですか?

SQL Serverでは、ロックは通常、行またはページ->テーブルからエスカレートされます。 SQL Server 2008以降、新しいレベルのロックエスカレーションが追加されました- パーティションレベル

ただし、これはパーティション分割テーブルでは自動的に有効になりません。デフォルトでは、テーブルはパーティションロックをスキップして、行またはページ->テーブルから直接進むように設定されています。なぜこれが当てはまるのでしょうか?すべてのテーブルをTABLEからAUTOに切り替えて、ロックをテーブルレベルではなくパーティションレベルにエスカレートしたくない理由はありますか?

デフォルトはまだTABLEなので、AUTOのマイナス面について、何か足りない点があると思います。

7
SqlRyan

[〜#〜] bol [〜#〜] 回答あり-デッドロックの可能性を高める可能性があるため、デフォルトではオンではありません。

データベースエンジンは、行またはキー範囲のロックをページロックにエスカレートしませんが、テーブルロックに直接エスカレートします。同様に、ページロックは常にテーブルロックにエスカレートされます。 SQL Server 2008では、パーティションテーブルのロックは、テーブルロックではなく、関連するパーティションのHoBTレベルにエスカレートする可能性があります。 HoBTレベルのロックは、必ずしもパーティションの整列されたHoBTをロックするわけではありません。

HoBTレベルのロックは通常、同時実行性を高めますが、異なるパーティションをロックしているトランザクションがそれぞれの排他ロックを他のパーティションに拡張したい場合にデッドロックが発生する可能性があります。まれに、TABLEロックの細分性が向上する場合があります。

7
SQL Learner