次の方法で共有


sp_indexoption (Transact-SQL)

適用対象: SQL サーバー

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

SQL Server データベース エンジンは、ページ レベル、行レベル、またはテーブル レベルのロックを自動的に選択します。 これらのオプションを手動で設定する必要はありません。 sp_indexoption は、特定の種類のロックが常に適切であることを確実に知っている専門家のユーザーに提供されます。

重要

この機能は、 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_namenvarchar(1035) で、既定値はありません。 引用符は、修飾インデックスまたはテーブル名が指定されている場合にのみ必要です。 データベース名も含めてフル パスで指定した場合は、そのデータベース名は現在のデータベース名である必要があります。 インデックスのないテーブル名が指定されている場合、クラスター化インデックスが存在しない場合は、そのテーブルのすべてのインデックスとテーブル自体に対して指定されたオプション値が設定されます。

[ @OptionName = ] 'option_name' インデックス オプション名です。 option_namevarchar(35) で、既定値はありません。 option_name には、次のいずれかの値を指定できます。

Value 説明
AllowRowLocks TRUE の場合、インデックスにアクセスするときに行ロックが許可されます。 いつ行ロックを使用するかは、データベース エンジンによって決定されます。 FALSE の場合、行ロックは使用されません。 既定は TRUE です。
AllowPageLocks TRUE の場合、インデックスにアクセスするときにページ ロックが許可されます。 いつページ ロックを使用するかは、データベース エンジン によって決定されます。 FALSE の場合、ページ ロックは使用されません。 既定は TRUE です。
DisAllowRowLocks TRUE の場合、行ロックは使用されません。 FALSE の場合、インデックスにアクセスするときに行ロックが許可されます。 いつ行ロックを使用するかは、データベース エンジンによって決定されます。
DisAllowPageLocks TRUE の場合、ページ ロックは使用されません。 FALSE の場合、インデックスにアクセスするときにページ ロックが許可されます。 いつページ ロックを使用するかは、データベース エンジン によって決定されます。

[ @OptionValue = ] 'value'option_name設定が有効 (TRUE、ON、はい、または 1) か無効 (FALSE、OFF、いいえ、または 0) かを指定します。 valuevarchar(12)で、既定値はありません。

リターン コードの値

0 (成功) または 0 より大きい (失敗)

解説

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 に設定されている場合は、ヒープおよび関連付けられている非クラスター化インデックスに設定が適用されます。

  • AllowPageLocks オプションが FALSE または DisAllowPageLocks が TRUE に設定されている場合、この設定は非クラスター化インデックスに完全に適用されます。 つまり、非クラスター化インデックスでは、すべてのページ ロックが許可されません。 ヒープで許可されないのは、ページに対する共有 (S)、更新 (U)、および排他 (X) ロックのみです。 データベース エンジンでは内部目的用にインテント ページ ロック (IS、IU、または IX) を引き続き取得できます。

アクセス許可

テーブルに対する ALTER 権限が必要です。

A. 特定のインデックスにオプションを設定する

次の例では、Customer テーブルのIX_Customer_TerritoryID インデックスのページ ロックを禁止します。

USE AdventureWorks2022;  
GO  
EXEC sp_indexoption N'Sales.Customer.IX_Customer_TerritoryID',  
    N'disallowpagelocks', TRUE;  

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

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

USE AdventureWorks2022;  
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: クラスター化インデックスのないテーブルに対してオプションを設定する

次の例では、クラスター化インデックスを持たないテーブル (ヒープ) について、ページ ロックを許可していません。 sys.indexes カタログ ビューは、ステートメントの結果を表示するために、sp_indexoption プロシージャが実行される前と後にクエリされます。

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

参照

INDEXPROPERTY (Transact-SQL)
システム ストアド プロシージャ (Transact-SQL)
sys.indexes (Transact-SQL)