Выполнение операций с индексами в режиме "в сети"
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure базе данных SQL в Microsoft Fabric
В этой статье описывается создание, перестроение или удаление индексов в интернете в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Этот ONLINE
параметр позволяет одновременно получать доступ пользователей к базовой таблице или кластеризованным данным индекса и любым связанным некластеризованным индексам во время этих операций индекса. Например, пока пользователь перестраивает кластеризованный индекс, он и другие пользователи могут продолжать обновление базовых данных и осуществлять к ним запросы.
При выполнении операций языка определения данных (DDL) в автономном режиме, таких как построение или перестроение кластеризованного индекса, эти операции удерживают монопольные блокировки (X) на базовых данных и связанных индексах. Это предотвращает изменение базовых данных и осуществление запросов к ним до завершения операции с индексами.
Примечание.
Команды перестроения индекса могут содержать монопольные блокировки кластеризованных индексов после удаления большого столбца объектов из таблицы даже при выполнении в сети.
Поддерживаемые платформы
Операции с индексами в Сети недоступны в каждом выпуске SQL Server. Дополнительные сведения см. в выпусках и поддерживаемых функциях SQL Server 2022.
Операции с индексами в сети доступны в Базе данных SQL Azure и Управляемом экземпляре SQL Azure.
Ограничения
Рекомендуется выполнять операции с индексами в сети в производственной среде, работающей 24 часа в сутки и семь дней в неделю, когда имеется насущная необходимость одновременных действий пользователей во время выполнения операций с индексами.
Этот ONLINE
параметр доступен в следующих инструкциях Transact-SQL.
- CREATE INDEX
- ALTER INDEX
- DROP INDEX
- ALTER TABLE (добавление или удаление
UNIQUE
илиPRIMARY KEY
ограничение сCLUSTERED
параметром индекса)
Дополнительные ограничения и ограничения, касающиеся создания, перестроения или удаления индексов в Сети, см. в рекомендациях по операциям с индексами в сети.
Разрешения
Необходимо разрешение ALTER
для таблицы или представления.
Использование SQL Server Management Studio
В обозреватель объектов выберите знак "плюс", чтобы развернуть базу данных, содержащую таблицу, в которой требуется перестроить индекс в Сети.
Разверните папку Таблицы.
Выберите знак "плюс", чтобы развернуть таблицу, в которой требуется перестроить индекс в Сети.
Разверните папку Индексы.
Щелкните правой кнопкой мыши индекс, который нужно перестроить в режиме "в сети", и выберите Свойства.
В разделе Выбор страницыщелкните Параметры.
Выберите свойство Разрешить обработку DML в сетии выберите из списка значение True .
Нажмите ОК.
Щелкните правой кнопкой мыши индекс, который нужно перестроить в режиме "в сети", и выберите пункт Перестроить.
В диалоговом окне "Перестроить индексы" убедитесь, что правильный индекс находится в индексах для перестроения сетки и нажмите кнопку "ОК".
Использование Transact-SQL
В следующем примере показано, как перестроить имеющийся онлайн-индекс в базе данных AdventureWorks.
ALTER INDEX AK_Employee_NationalIDNumber
ON HumanResources.Employee
REBUILD WITH (ONLINE = ON);
В следующем примере кластеризованный индекс удаляется в режиме в сети и результирующая таблица (куча) перемещается в файловую группу NewGroup
с использованием предложения MOVE TO
. Представления каталога sys.indexes
, sys.tables
и sys.filegroups
запрашиваются для проверки размещения индекса и таблицы в файловых группах до и после перемещения.
-- Create a clustered index on the PRIMARY filegroup if the index does not exist.
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name =
N'AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate')
CREATE UNIQUE CLUSTERED INDEX
AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials (ProductAssemblyID, ComponentID,
StartDate)
ON 'PRIMARY';
GO
-- Verify filegroup location of the clustered index.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
JOIN sys.tables as t ON i.object_id = t.object_id
AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U')
GO
-- Create filegroup NewGroup if it does not exist.
IF NOT EXISTS (SELECT name FROM sys.filegroups
WHERE name = N'NewGroup')
BEGIN
ALTER DATABASE AdventureWorks2022
ADD FILEGROUP NewGroup;
ALTER DATABASE AdventureWorks2022
ADD FILE (NAME = File1,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\File1.ndf')
TO FILEGROUP NewGroup;
END
GO
-- Verify new filegroup
SELECT * from sys.filegroups;
GO
-- Drop the clustered index and move the BillOfMaterials table to
-- the Newgroup filegroup.
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials
WITH (ONLINE = ON, MOVE TO NewGroup);
GO
-- Verify filegroup location of the moved table.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
JOIN sys.tables as t ON i.object_id = t.object_id
AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U');
Дополнительные сведения см. в разделе ALTER INDEX (Transact-SQL).