Поделиться через


Выполнение операций с индексами в режиме "в сети"

Область применения:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLБаза данных SQL в Microsoft Fabric

В этой статье описывается создание, перестроение или удаление индексов в Интернете с помощью SQL Server Management Studio или Transact-SQL. Этот ONLINE параметр позволяет одновременно получать доступ пользователей к базовой таблице или кластеризованным данным индекса и любым связанным некластеризованным индексам во время этих операций индекса. Например, пока пользователь перестраивает кластеризованный индекс, он и другие пользователи могут продолжать обновление базовых данных и осуществлять к ним запросы.

При выполнении операций языка определения данных (DDL) в автономном режиме, таких как сборка или перестроение кластеризованного индекса, эти операции удерживают монопольные (X) блокировки базовых данных и связанных индексов. Это предотвращает изменение базовых данных и осуществление запросов к ним до завершения операции с индексами.

Примечание.

Команды перестроения индекса могут содержать монопольные блокировки кластеризованных индексов после удаления столбца с большими объектами из таблицы, даже при выполнении в режиме онлайн.

Этот ONLINE параметр доступен в следующих инструкциях Transact-SQL.

Ограничения и условия, касающиеся создания, перестроения или удаления индексов в режиме онлайн, см. в Руководства по операциям с индексами онлайн.

Чтобы использовать операции возобновления индексирования, необходимо выполнить операцию индекса в сети. Дополнительные сведения см. в статье Соображения по возобновляемым индексам.

Поддерживаемые платформы

Операции с индексами в Сети недоступны в каждом выпуске SQL Server. Дополнительные сведения см. в выпусках и поддерживаемых функциях SQL Server 2022.

Операции с индексами в сети доступны в Базе данных SQL Azure и Управляемом экземпляре SQL Azure.

Разрешения

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

Использование SQL Server Management Studio

  1. В обозревателе объектов разверните базу данных, содержащую таблицу, для которой требуется перестроить индекс в режиме онлайн.

  2. Разверните папку Таблицы.

  3. Разверните таблицу, в которой вы хотите перестроить индекс в режиме онлайн.

  4. Разверните папку Индексы.

  5. Используйте контекстное меню для индекса, который вы хотите перестроить онлайн, и выберите Свойства.

  6. В разделе Выбор страницыщелкните Параметры.

  7. Выберите свойство Разрешить обработку DML в сетии выберите из списка значение True .

  8. Нажмите ОК.

  9. Используйте контекстное меню для индекса, который вы хотите перестроить в режиме онлайн, и выберите Перестроить.

  10. В диалоговом окне "Перестроить индексы" убедитесь, что правильный индекс находится в индексах для перестроения сетки и нажмите кнопку "ОК".

Использование 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).