Executar operações de índice online
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
Este artigo descreve como criar, recompilar ou soltar índices online no SQL Server usando o SQL Server Management Studio ou Transact-SQL. A opção ONLINE
permite acesso simultâneo de usuários aos dados da tabela subjacente ou de índice cluster e qualquer índice não cluster associado durante essas operações de índice. Por exemplo, enquanto um índice cluster estiver sendo recriado por um usuário, esse usuário e os outros poderão continuar atualizando e consultando os dados subjacentes.
Quando você executa operações de DDL (linguagem de definição de dados) offline, como a compilação ou recompilação de um índice clusterizado, essas operações mantêm bloqueios exclusivos (X) nos dados subjacentes e índices associados. Isso evita modificações e consultas aos dados subjacentes até que a operação de índice esteja concluída.
Observação
Os comandos de reconstrução de índice podem conter bloqueios exclusivos em índices clusterizados depois que uma coluna de objeto grande é descartada de uma tabela, mesmo quando executada online.
Plataformas compatíveis
As operações de índice online não estão disponíveis em todas as edições de SQL Server. Para obter mais informações, confira Edições e recursos com suporte do SQL Server 2022.
As operações de índice online estão disponíveis no Banco de Dados SQL do Azure e na Instância Gerenciada de SQL do Azure.
Limitações
Nós recomendamos a execução de operações de índice online em ambientes empresariais que funcionam 24 horas por dia, sete dias por semana, nos quais a necessidade para atividade de usuário simultânea durante as operações de índice é vital.
A opção ONLINE
está disponível nas instruções do Transact-SQL a seguir.
- CREATE INDEX
- ALTER INDEX
- DROP INDEX
- ALTER TABLE (para adicionar ou remover restrições
UNIQUE
ouPRIMARY KEY
com a opção de índiceCLUSTERED
)
Por obter mais informações sobre limitação e restrições sobre como criar, recriar ou descartar índices online, consulte Diretrizes para operações de índice online.
Permissões
Requer a permissão ALTER
na tabela ou exibição.
Usar o SQL Server Management Studio
No Pesquisador de Objetos, selecione o sinal de adição para expandir o banco de dados que contém a tabela na qual você deseja recriar um índice online.
Expanda a pasta Tabelas .
Selecione o sinal de adição para expandir a tabela na qual você deseja recriar um índice online.
Expanda a pasta Índices .
Clique com o botão direito do mouse no índice que você quer recriar online e selecione Propriedades.
Em Selecione uma página, selecione Opções.
Selecione Permitir processamento DML onlinee selecione Verdadeiro na lista.
Selecione OK.
Clique com o botão direito do mouse no índice que você quer recriar online e selecione Recompilar.
Na caixa de diálogo Recriar Índices, verifique se o índice correto está na grade Índices a serem recriados e clique em OK.
Usar o Transact-SQL
O exemplo a seguir recria um índice online existente no banco de dados AdventureWorks.
ALTER INDEX AK_Employee_NationalIDNumber
ON HumanResources.Employee
REBUILD WITH (ONLINE = ON);
O exemplo a seguir exclui um índice clusterizado online e move a tabela resultante (heap) para o grupo de arquivos NewGroup
usando a cláusula MOVE TO
. As exibições do catálogo sys.indexes
, sys.tables
e sys.filegroups
são consultadas para verificar o posicionamento do índice e da tabela nos grupos de arquivos antes e depois da movimentação.
-- 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');
Para mais informações, consulte ALTERAR ÍNDICE (Transact-SQL).