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'
    Указывает, включен параметр аргумента option_name (TRUE, ON, yes или 1) или отключен (FALSE, OFF, no или 0). Аргумент value имеет тип varchar(12) и не имеет значения по умолчанию.

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

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

Замечания

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

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

  • При доступе к индексу разрешены блокировки на уровнях строки, страницы, таблицы, если параметр AllowRowLocks = TRUE или DisAllowRowLocks = FALSE, и AllowPageLocks = TRUE или DisAllowPageLocks = FALSE. Компонент Компонент 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 AdventureWorks2012;
GO
EXEC sp_indexoption N'Sales.Customer.IX_Customer_TerritoryID',
    N'disallowpagelocks', TRUE;

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

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

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

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

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

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

См. также

Справочник

INDEXPROPERTY (Transact-SQL)

Системные хранимые процедуры (Transact-SQL)

sys.indexes (Transact-SQL)