Выполнение операции с индексами в сетиPerform Index Operations Online

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

В этом разделе описывается создание, перестроение и удаление индексов в режиме «в сети» в SQL Server 2017SQL Server 2017 с помощью среды SQL Server Management StudioSQL Server Management Studio и Transact-SQLTransact-SQL.This topic describes how to create, rebuild, or drop indexes online in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. Параметр ONLINE разрешает одновременный доступ пользователей к базовой таблице или данным кластеризованного индекса и всем связанным некластеризованным индексам во время выполнения этих операций с индексами.The ONLINE option allows concurrent user access to the underlying table or clustered index data and any associated nonclustered indexes during these index operations. Например, пока пользователь перестраивает кластеризованный индекс, он и другие пользователи могут продолжать обновление базовых данных и осуществлять к ним запросы.For example, while a clustered index is being rebuilt by one user, that user and others can continue to update and query the underlying data. Если операции языка описания данных DDL (DDL), такие как построение или перестроение кластеризованного индекса, выполняются в режиме «вне сети», то они удерживают монопольные блокировки на базовые данные и связанные индексы.When you perform data definition language (DDL) operations offline, such as building or rebuilding a clustered index; these operations hold exclusive locks on the underlying data and associated indexes. Это предотвращает изменение базовых данных и осуществление запросов к ним до завершения операции с индексами.This prevents modifications and queries to the underlying data until the index operation is complete.

Примечание

Операции с индексами в сети доступны не во всех выпусках SQL ServerSQL Server .Online index operations are not available in every SQL ServerSQL Server edition. Дополнительные сведения см. в статье "Возможности, поддерживаемые различными выпусками SQL Server 2016".For more information, see Features Supported by the Editions of SQL Server 2016.

В этом разделеIn This Topic

Перед началомBefore You Begin

ОграниченияLimitations and Restrictions

  • Рекомендуется выполнять операции с индексами в сети в производственной среде, работающей 24 часа в сутки и семь дней в неделю, когда имеется насущная необходимость одновременных действий пользователей во время выполнения операций с индексами.We recommend performing online index operations for business environments that operate 24 hours a day, seven days a week, in which the need for concurrent user activity during index operations is vital.

  • Параметр ONLINE доступен в следующих инструкциях языка Transact-SQLTransact-SQL .The ONLINE option is available in the following Transact-SQLTransact-SQL statements.

  • Дополнительные ограничения и ограничения, касающиеся создания, восстановления или удаления индексов в режиме "в сети", см. в разделе Инструкции по операциям с индексами в сети.For more limitations and restrictions concerning creating, rebuilding, or dropping indexes online, see Guidelines for Online Index Operations.

безопасностьSecurity

PermissionsPermissions

Необходимо разрешение ALTER для таблицы или представления.Requires ALTER permission on the table or view.

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

Перестроение индекса в режиме «в сети»To rebuild an index online

  1. В обозревателе объектов щелкните знак «плюс», чтобы развернуть базу данных, содержащую таблицу, в которой необходимо перестроить индекс в режиме «в сети».In Object Explorer, click the plus sign to expand the database that contains the table on which you want to rebuild an index online.

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

  3. Щелкните знак «плюс», чтобы развернуть таблицу, в которой необходимо перестроить индекс в режиме «в сети».Click the plus sign to expand the table on which you want to rebuild an index online.

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

  5. Щелкните правой кнопкой мыши индекс, который нужно перестроить в режиме "в сети", и выберите Свойства.Right-click the index that you want to rebuild online and select Properties.

  6. В разделе Выбор страницыщелкните Параметры.Under Select a page, select Options.

  7. Выберите свойство Разрешить обработку DML в сетии выберите из списка значение True .Select Allow online DML processing, and then select True from the list.

  8. Нажмите кнопку ОК.Click OK.

  9. Щелкните правой кнопкой мыши индекс, который нужно перестроить в режиме "в сети", и выберите пункт Перестроить.Right-click the index that you want to rebuild online and select Rebuild.

  10. В диалоговом окне Перестроение индексов убедитесь, что нужный индекс приведен в сетке Индексы для перестройки и нажмите кнопку ОК.In the Rebuild Indexes dialog box, verify that the correct index is in the Indexes to rebuild grid and click OK.

Использование Transact-SQLUsing Transact-SQL

Создание, перестроение и удаление индекса в режиме «в сети»To create, rebuild, or drop an index online

В следующем примере показано, как перестроить имеющийся онлайн-индекс в базе данных AdventureWorks.The following example rebuilds an existing online index in the AdventureWorks database.

ALTER INDEX AK_Employee_NationalIDNumber
  ON HumanResources.Employee  
  REBUILD WITH (ONLINE = ON)
;

В следующем примере кластеризованный индекс удаляется в режиме в сети и результирующая таблица (куча) перемещается в файловую группу NewGroup с использованием предложения MOVE TO .The following example deletes a clustered index online and moves the resulting table (heap) to the filegroup NewGroup by using the MOVE TO clause. Представления каталога sys.indexes, sys.tablesи sys.filegroups запрашиваются для проверки размещения индекса и таблицы в файловых группах до и после перемещения.The sys.indexes, sys.tables, and sys.filegroups catalog views are queried to verify the index and table placement in the filegroups before and after the move.

--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 AdventureWorks2012
        ADD FILEGROUP NewGroup;
    ALTER DATABASE AdventureWorks2012
        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).For more information, see ALTER INDEX (Transact-SQL).