インデックスのロックのカスタマイズ
Microsoft SQL Server データベース エンジン では、ほとんどの場合において、クエリに対し最適なロック粒度を自動的に選択するという動的ロック ストラテジを採用しています。アクセス パターンが一定していることがわかっている場合、インデックスに使用できるロック レベルを制限すると便利です。
たとえば、あるデータベース アプリケーションでバッチ処理により週単位で更新される参照テーブルを使用しているとします。この場合、最も効率的なロック ストラテジは、ページと行のロックを無効にして、すべての同時読み取り側でそのテーブルに対する共有 (S) ロックを獲得できるようにしてオーバーヘッドを削減することです。週に 1 回のバッチ更新のときには、更新プロセスで排他 (X) ロックを獲得し、テーブル全体を更新できます。
インデックスで使用するロックの粒度は、CREATE INDEX ステートメントまたは ALTER INDEX ステートメントを使用して設定できます。また、CREATE TABLE ステートメントと ALTER TABLE ステートメントを使用して、PRIMARY KEY 制約および UNIQUE 制約によるロック粒度を設定することもできます。旧バージョンとの互換性を維持しているため、sp_indexoption システム ストアド プロシージャを使用して粒度を設定することもできます。特定のインデックスの現在のロックのオプションを表示するには、INDEXPROPERTY 関数を使用します。特定のインデックスに対して、ページレベルのロック、行レベルのロック、またはこの 2 つのロックの組み合わせを禁止することができます。
禁止されるロック | インデックスにかけられるロック |
---|---|
ページレベルのロック |
行レベルおよびテーブルレベルのロック |
行レベルのロック |
ページレベルおよびテーブルレベルのロック |
ページレベルおよび行レベルのロック |
テーブルレベルのロック |
たとえば、テーブルで競合が発生していることがわかっている場合、ページレベルのロックを禁止し、行レベルのロックだけを許可することで競合を解決できる場合があります。また、インデックスやテーブルにアクセスするのにテーブル スキャンを必ず使用する場合、テーブルレベルのロックだけを許可し、ページレベルと行レベルのロックを禁止すると便利です。
重要 : |
---|
データベース エンジン のクエリ オプティマイザでは、ほとんどの場合、適切なロック粒度が選択されます。オプティマイザによる設定は変更しないことをお勧めします。ロック レベルを禁止すると、テーブルまたはインデックスの同時実行性が低下することがあります。たとえば、多くのユーザーが頻繁にアクセスする大きなテーブルに対して、テーブルレベルのロックだけを指定すると、パフォーマンスが大幅に低下する可能性があります。ユーザーがそのテーブルにアクセスするには、テーブルレベルのロックが解除されるまで待機する必要があります。 |
参照
その他の技術情報
ALTER INDEX (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE INDEX (Transact-SQL)
CREATE TABLE (Transact-SQL)
INDEXPROPERTY (Transact-SQL)
sp_indexoption (Transact-SQL)