sp_indexoption (Transact-SQL)

Устанавливает блокирующие значения параметров для определенных пользователем кластеризованных и некластеризованных индексов или таблиц, не имеющих кластеризованного индекса.

Компонент SQL Server Database Engine автоматически делает выбор уровня блокировки: страница, строка, таблица. Нежелательно устанавливать эти параметры вручную. Процедура 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, то допустимы блокировки строк при доступе к индексу. Компонент Database Engine определяет, когда используются блокировки строк. Если FALSE, то блокировка строк не используется. Значение по умолчанию — TRUE.

    AllowPageLocks

    Если TRUE, то допустимы блокировки страниц при доступе к индексу. Компонент Database Engine определяет, когда используются блокировки страниц. Если FALSE, то блокировка страниц не используется. Значение по умолчанию — TRUE.

    DisAllowRowLocks

    Если TRUE, то блокировка строк не используется. Если FALSE, то допустимы блокировки строк при доступе к индексу. Компонент Database Engine определяет, когда используются блокировки строк.

    DisAllowPageLocks

    Если TRUE, то блокировка страниц не используется. Если FALSE, то допустимы блокировки страниц при доступе к индексу. Компонент Database Engine определяет, когда используются блокировки страниц.

  • [ @OptionValue =] 'value'
    Указывает, включен (TRUE, ON, yes или 1) или выключен (FALSE, OFF, no или 0) параметр option_name. Аргумент value имеет тип varchar(12) и не имеет значения по умолчанию.

Значения кодов возврата

0 (успешное завершение) или больше чем 0 (неуспешное завершение)

Замечания

XML-индексы не поддерживаются. Если указаны XML-индексы, или имя таблицы указано без имени индекса, и таблица содержит XML-индекс, то инструкция завершается ошибкой. Чтобы задать значения для этих параметров, используйте инструкцию ALTER INDEX.

Чтобы отобразить текущие свойства блокировки строки и страницы, используйте функцию INDEXPROPERTY или представление каталога sys.indexes.

  • При доступе к индексу разрешены блокировки на уровнях строки, страницы, таблицы, если параметр AllowRowLocks = TRUE или DisAllowRowLocks = FALSE, и AllowPageLocks = TRUE или DisAllowPageLocks = FALSE. Компонент Database Engine выбирает соответствующую блокировку и может повышать уровень с блокировки строки или страницы до блокировки таблицы. Дополнительные сведения см. в разделе Укрупнение блокировки (компонент Database Engine).

Если AllowRowLocks = FALSE или DisAllowRowLocks = TRUE и AllowPageLocks = FALSE или DisAllowPageLocks = TRUE, то при доступе к индексу допустима только блокировка на уровне таблицы.

Если имя таблицы указано без индекса, то настройка применяется ко всем индексам этой таблицы. Если базовая таблица не имеет кластеризованного индекса (т.е. имеется куча), то настройки применяются следующим образом:

  • Если параметру AllowRowLocks или DisAllowRowLocks присвоено значение TRUE или FALSE, то установка применяется к куче и любым связанным некластеризованным индексам.

  • Если параметру AllowRowLocks присвоено значение TRUE или параметру DisAllowRowLocks присвоено значение FALSE, то установка применяется к куче и любым связанным некластеризованным индексам.

  • Если параметру AllowRowLocks присвоено значение FALSE или параметру DisAllowRowLocks присвоено значение TRUE, то установка полностью применяется к некластеризованным индексам. Таким образом, все блокировки страниц не допускаются для некластеризованных индексов. В куче, для страницы недопустимы только совмещаемая (S), обновления (U) и монопольная (X) блокировки. Компонент Database Engine все же может запросить намеренную блокировку страницы (IS, IU или IX) для внутренних целей.

Дополнительные сведения о настройке степени гранулярности блокировок для индекса см. в разделе Настройка блокировки индекса.

Разрешения

Требуется разрешение ALTER на таблицу.

Примеры

А. Настройка параметра на указанный индекс

Следующий пример запрещает блокировки страниц на индекс IX_Customer_TerritoryID в таблице Customer.

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

Б. Настройка параметра на все индексы таблицы

Следующий пример демонстрирует блокировки строк на все индексы, связанные с таблицей Product. Представление каталога sys.indexes запрашивается до и после выполнения процедуры sp_indexoption для демонстрации результата выполнения инструкции.

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

В. Настройка параметра на таблицу, не имеющую кластеризованного индекса

Следующий пример запрещает блокировки страниц на таблицу, не имеющую кластеризованного индекса (куча). Представление каталога sys.indexes запрашивается до и после выполнения процедуры sp_indexoption для демонстрации результата выполнения инструкции.

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