Estou adicionando uma restrição de verificação a uma tabela grande porque quero prepará-la para transformá-la em uma tabela particionada usando a alternância de partições.
A verificação é uma verificação de desigualdade simples em uma coluna e há um índice nessa coluna. Mas quando adiciono a restrição, o SQL Server ainda executa uma varredura de toda a tabela. É possível adicionar a restrição rapidamente e mantê-la confiável? Eu esperava que fosse possível por causa do índice.
Aqui está uma reprodução que mostra essa digitalização:
USE tempdb;
GO
SELECT *
INTO MY_MESSAGES
FROM sys.messages;
CREATE CLUSTERED INDEX IX_MY_MESSAGES ON dbo.MY_MESSAGES(message_id);
SET STATISTICS IO ON;
ALTER TABLE dbo.MY_MESSAGES
ADD CONSTRAINT CK_mymessages CHECK (message_id < 50000);
SET STATISTICS IO OFF;
DROP TABLE IF EXISTS dbo.MY_MESSAGES;
Isso é mostrado na aba de mensagens:
Table 'MY_MESSAGES'. Scan count 1, logical reads 10955
Infelizmente, a lógica de verificação de restrição é muito básica e não aproveitará um índice da maneira que você espera. Ela não buscará valores que não atendam à restrição. Poderia, mas não faz.
Como Dan diz , um índice fino não agrupado pode tornar a varredura mais eficiente.
Você pode capturar o plano de consulta com o Query Store. Ele mostrará um scan, um Compute Scalar com uma
CASE
expressão para testar a condição de restrição e um Assert para lançar um erro, se necessário.Uma varredura completa da tabela ou índice será necessária para garantir que os valores existentes estejam em conformidade com a expressão de restrição de verificação. Você pode ver uma ligeira melhoria de desempenho com um índice não clusterizado,
message_id
já que menos leituras lógicas serão necessárias para a validação, mas cada linha no índice ainda precisará ser varrida.Considere particionar esta tabela de forma similar à tabela de partição de destino. Isso garantirá que os dados na partição de origem estejam em conformidade com os limites de partição da tabela de destino, permitindo o uso de
SWITCH
sem uma restrição de verificação confiável, evitando assim a necessidade de validar dados com uma varredura.A restrição pode ser adicionada rapidamente usando "WITH NOCHECK" para ignorar dados existentes. Você pode confiar que a restrição será aplicada a dados novos/alterados. Você não saberá se os dados existentes estão em conformidade com a restrição de verificação. No entanto, você pode executar sua própria consulta de seleção para validar dados existentes. O PK pode ser usado para verificar usando lotes, sabendo que, uma vez que um intervalo seja verificado, ele permanecerá válido.