sp_indexoption (Transact-SQL)
Область применения: SQL Server
Устанавливает блокирующие значения параметров для определенных пользователем кластеризованных и некластеризованных индексов или таблиц, не имеющих кластеризованного индекса.
SQL Server ядро СУБД автоматически делает выбор блокировки уровня страницы, строки или таблицы. Эти параметры не нужно задавать вручную. sp_indexoption
предоставляется для экспертов, которые знают, что определенный тип блокировки всегда подходит.
Внимание
Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Вместо этого используйте ALTER INDEX.
Соглашения о синтаксисе Transact-SQL
Синтаксис
sp_indexoption
[ @IndexNamePattern = ] N'IndexNamePattern'
, [ @OptionName = ] 'OptionName'
, [ @OptionValue = ] 'OptionValue'
[ ; ]
Аргументы
[ @IndexNamePattern = ] N'IndexNamePattern'
Полное или неквалифицированное имя определяемой пользователем таблицы или индекса. @IndexNamePattern — nvarchar(1035) без значения по умолчанию. Кавычки требуются, только если указан уточненный индекс или таблица. Если указано полное имя таблицы, включая имя базы данных, в качестве последнего должно использоваться имя текущей базы данных. Если имя таблицы указано без индекса, то значение указанного аргумента устанавливается во все индексы этой таблицы и в саму таблицу, если не существует кластеризованных индексов.
[ @OptionName = ] 'OptionName'
Имя параметра индекса. @OptionName — varchar(35) и может быть одним из следующих значений.
значение | Описание |
---|---|
AllowRowLocks |
Если TRUE при доступе к индексу разрешены блокировки строк. Ядро СУБД определяет, когда используются блокировки строк. Если FALSE блокировки строк не используются. Значение по умолчанию — TRUE . |
AllowPageLocks |
Если TRUE при доступе к индексу разрешены блокировки страниц. Ядро СУБД определяет, когда используются блокировки страниц. Если FALSE блокировки страниц не используются. Значение по умолчанию — TRUE . |
DisAllowRowLocks |
Если TRUE блокировки строк не используются. Если FALSE при доступе к индексу разрешены блокировки строк. Ядро СУБД определяет, когда используются блокировки строк. |
DisAllowPageLocks |
Если TRUE блокировки страниц не используются. Если FALSE при доступе к индексу разрешены блокировки страниц. Ядро СУБД определяет, когда используются блокировки страниц. |
[ @OptionValue = ] 'OptionValue'
Указывает, включен ли параметр @OptionName (TRUE
, , yes
ON
или) или 1
отключен (FALSE
, , OFF
no
или 0
). @OptionValue — varchar(12), без значения по умолчанию.
Значения кода возврата
0
(успешно) или > 0
(сбой).
Замечания
XML-индексы не поддерживаются. Если указаны XML-индексы, или имя таблицы указано без имени индекса, и таблица содержит XML-индекс, то инструкция завершается ошибкой. Чтобы задать эти параметры, используйте ALTER INDEX .
Чтобы отобразить текущие свойства блокировки строк и страниц, используйте представление каталога INDEXPROPERTY или sys.indexes .
- Блокировки на уровне строк, уровня страницы и таблицы разрешены при доступе к индексу, когда
AllowRowLocks = TRUE
илиDisAllowRowLocks = FALSE
,DisAllowPageLocks = FALSE
илиAllowPageLocks = TRUE
. Ядро СУБД выбирает соответствующую блокировку и может передавать блокировку из строки или блокировки страницы на блокировку таблицы.
При доступе к индексу допускается только блокировка на уровне таблицы, когда 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
для таблицы.
Примеры
А. Установка параметра для определенного индекса
В следующем примере запрещается блокировка страницы индекса IX_Customer_TerritoryID
в Customer
таблице.
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
В. Установка параметра в таблице без кластеризованного индекса
Следующий пример запрещает блокировки страниц на таблицу, не имеющую кластеризованного индекса (куча). Представление 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