sp_indexoption (Transact-SQL)

ユーザー定義のクラスタ化インデックスおよび非クラスタ化インデックス、またはクラスタ化インデックスを持たないテーブルに対するロック オプションの値を設定します。

SQL Server データベース エンジンは、ページレベル、行レベル、またはテーブルレベルのロックを自動的に選択します。これらのオプションを手動で設定する必要はありません。sp_indexoption は、どの種類のロックが適切であるのかを熟知しているエキスパート ユーザー向けに用意されています。

重要な注意事項重要

この機能は、Microsoft SQL Server の次のバージョンで削除されます。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに、ALTER INDEX (Transact-SQL) を使用してください。

トピック リンク アイコン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 AdventureWorks2008R2;
GO
EXEC sp_indexoption N'Sales.Customer.IX_Customer_TerritoryID',
    N'disallowpagelocks', TRUE;

B. テーブルのすべてのインデックスに対してオプションを設定する

次の例では、Product テーブルに関連付けられたすべてのインデックスに対して、行ロックを許可していません。sp_indexoption プロシージャの実行前と後に sys.indexes カタログ ビューに対するクエリを実行して、ステートメントの結果を表示します。

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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