sp_indexoption (Transact-SQL)
ユーザー定義のクラスター化インデックスおよび非クラスター化インデックス、またはクラスター化インデックスを持たないテーブルに対するロック オプションの値を設定します。
SQL Server データベース エンジンは、ページレベル、行レベル、またはテーブルレベルのロックを自動的に選択します。 これらのオプションを手動で設定する必要はありません。 sp_indexoption は、どの種類のロックが適切であるのかを熟知しているエキスパート ユーザー向けに用意されています。
重要 |
---|
この機能は、Microsoft SQL Server の次のバージョンで削除されます。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに、ALTER INDEX (Transact-SQL) を使用してください。 |
構文
sp_indexoption [ @IndexNamePattern = ] 'table_or_index_name'
, [ @OptionName = ] 'option_name'
, [ @OptionValue = ] 'value'
引数
[ @IndexNamePattern=] 'table_or_index_name'
ユーザー定義テーブルまたはインデックスの修飾名または非修飾名です。 table_or_index_name のデータ型は nvarchar(1035) で、既定値はありません。 引用符が必要なのは、修飾されたインデックス名またはテーブル名を指定する場合のみです。 データベース名も含めてフル パスで指定した場合は、そのデータベース名は現在のデータベース名である必要があります。 インデックスなしでテーブル名を指定する場合、指定したオプションの値は、そのテーブルのすべてのインデックス、およびクラスター化インデックスが存在しない場合にはそのテーブル自体に設定されます。[ @OptionName =] 'option_name'
インデックス オプション名です。 option_name のデータ型は varchar(35) で、既定値はありません。 option_name は次のいずれかの値になります。値
説明
AllowRowLocks
TRUE の場合、インデックスにアクセスするときに行ロックが許可されます。 いつ行ロックを使用するかは、データベース エンジンによって決定されます。 FALSE の場合、行ロックは使用されません。 既定値は TRUE です。
AllowPageLocks
TRUE の場合、インデックスにアクセスするときにページ ロックが許可されます。 いつページ ロックを使用するかは、データベース エンジンによって決定されます。 FALSE の場合、ページ ロックは使用されません。 既定値は TRUE です。
DisAllowRowLocks
TRUE の場合、行ロックは使用されません。 FALSE の場合、インデックスにアクセスするときに行ロックが許可されます。 いつ行ロックを使用するかは、データベース エンジンによって決定されます。
DisAllowPageLocks
TRUE の場合、ページ ロックは使用されません。 FALSE の場合、インデックスにアクセスするときにページ ロックが許可されます。 いつページ ロックを使用するかは、データベース エンジンによって決定されます。
[ @OptionValue =] 'value'
option_name 設定が有効 (TRUE、ON、はい、または 1) であるか、無効 (FALSE、OFF、いいえ、または 0) であるかを指定します。 value のデータ型は varchar(12) で、既定値はありません。
戻り値
成功した場合は 0 を、失敗した場合は 1 以上の値をそれぞれ返します。
説明
XML インデックスはサポートされていません。 XML インデックスを指定した場合、またはテーブル名をインデックス名なしで指定し、テーブルに XML インデックスが含まれている場合、このステートメントは失敗します。 これらのオプションを設定する場合は、代わりに ALTER INDEX を使用してください。
現在の行およびページ ロックのプロパティを表示するには、INDEXPROPERTY または sys.indexes カタログ ビューを使用します。
- 行レベル、ページレベル、およびテーブルレベルのロックは、AllowRowLocks が TRUE または DisAllowRowLocks が FALSE、かつ AllowPageLocks が TRUE または DisAllowPageLocks が FALSE の状態で、インデックスにアクセスする場合に許可されます。 データベース エンジンは適切なロックを選択し、行ロックまたはページ ロックをテーブル ロックにエスカレートすることができます。
AllowRowLocks が FALSE または DisAllowRowLocks が TRUE、かつ AllowPageLocks が FALSE または DisAllowPageLocks が TRUE の状態でインデックスにアクセスする場合には、テーブルレベルのロックだけが許可されます。
テーブル名をインデックスなしで指定すると、設定はそのテーブルのすべてのインデックスに適用されます。 基になるテーブルにクラスター化インデックスがない (つまりヒープである) 場合、設定は次のように適用されます。
AllowRowLocks または DisAllowRowLocks が TRUE または FALSE に設定されている場合、設定はヒープおよび関連するすべての非クラスター化インデックスに適用されます。
AllowPageLocks オプションが TRUE に設定されているか、または DisAllowPageLocks が FALSE に設定されている場合、設定はヒープおよび関連するすべての非クラスター化インデックスに適用されます。
AllowPageLocks オプションが FALSE に設定されているか、または DisAllowPageLocks が TRUE に設定されている場合、設定は非クラスター化インデックスに完全に適用されます。 つまり、非クラスター化インデックスでは、すべてのページ ロックが許可されません。 ヒープで許可されないのは、ページに対する共有 (S)、更新 (U)、および排他 (X) ロックのみです。 データベース エンジンでは内部目的用にインテント ページ ロック (IS、IU または IX) を引き続き取得できます。
権限
テーブルに対する ALTER 権限が必要です。
使用例
A. 特定のインデックスに対してオプションを設定する
次の例では、Customer テーブルの IX_Customer_TerritoryID インデックスに対して、ページ ロックを許可していません。
USE AdventureWorks2012;
GO
EXEC sp_indexoption N'Sales.Customer.IX_Customer_TerritoryID',
N'disallowpagelocks', TRUE;
B. テーブルのすべてのインデックスに対してオプションを設定する
次の例では、Product テーブルに関連付けられたすべてのインデックスに対して、行ロックを許可していません。 sp_indexoption プロシージャの実行前と後に sys.indexes カタログ ビューに対するクエリを実行して、ステートメントの結果を表示します。
USE AdventureWorks2012;
GO
--Display the current row and page lock options for all indexes on the table.
SELECT name, type_desc, allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'Production.Product');
GO
-- Set the disallowrowlocks option on the Product table.
EXEC sp_indexoption N'Production.Product',
N'disallowrowlocks', TRUE;
GO
--Verify the row and page lock options for all indexes on the table.
SELECT name, type_desc, allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'Production.Product');
GO
C. クラスター化インデックスのないテーブルに対してオプションを設定する
次の例では、クラスター化インデックスを持たないテーブル (ヒープ) について、ページ ロックを許可していません。 sp_indexoption プロシージャの実行前と後に sys.indexes カタログ ビューに対するクエリを実行して、ステートメントの結果を表示します。
USE AdventureWorks2012;
GO
--Display the current row and page lock options of the table.
SELECT OBJECT_NAME (object_id) AS [Table], type_desc, allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = N'DatabaseLog';
GO
-- Set the disallowpagelocks option on the table.
EXEC sp_indexoption DatabaseLog,
N'disallowpagelocks', TRUE;
GO
--Verify the row and page lock settings of the table.
SELECT OBJECT_NAME (object_id) AS [Table], allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = N'DatabaseLog';
GO