temos uma tabela com 4 colunas ( exemplo ):
create TABLE [dbo].[myTable]
(
[Id] BIGINT NOT NULL,
[Id2] SMALLINT NOT NULL,
[Id3] SMALLINT NOT NULL,
[IdUnique] UNIQUEIDENTIFIER NOT NULL,
[CreateDate] DATETIME NOT NULL,
CONSTRAINT [PK_MyTable_Id_Id2_Id3] PRIMARY KEY CLUSTERED ([Id], [Id2], [Id3]),
CONSTRAINT [UQ_MyTable_IdUnique] UNIQUE NONCLUSTERED ([IdUnique] ASC )
)
A ideia é usar IdUnique no WHERE para recuperar ID,ID2 e ID3:
mas obviamente estamos tendo um keylookup.
Como posso INCLUIR uma coluna de inclusão em um índice exclusivo não clusterizado?
Não consigo encontrar nada relacionado a isso.
Índices de restrição exclusivos não permitem colunas incluídas. Você precisa criar um índice não clusterizado exclusivo regular em vez de incluir colunas.
Dito isso, não é necessário incluir essas colunas porque elas são a chave do índice clusterizado. A chave de índice clusterizado é incluída implicitamente em todos os nós folha de índice não clusterizado para uso como localizador de linha.
A única razão pela qual você vê uma pesquisa de chave no plano é por causa de
SELECT *
, que requerCreateDate
, além disso, as outras colunas de interesse. Mais um motivo para evitá-lo.Adicionando inclusões em restrições
Um
INCLUDE
não é compatível comCONSTRAINTS
o , seja em linha ou durante a criação autônoma. Se você quiser que seuCONSTRAINT
tenha umINCLUDE
, precisará criar oCONSTRAINT
comoUNIQUE INDEX
em vez disso.No entanto, conforme apontado por Paul White, a criação de índice embutido com inclusões não tem suporte até o SQL Server 2019. Nas versões do SQL Server anteriores a 2019, a solução alternativa seria criar uma
UNIQUE INDEX
instrução autônoma.Além disso, sua consulta está usando
SELECT *
, o que significa queCreateData
também está sendo retornado. Esta é a coluna que realmente conduz a pesquisa de chave. Então,CreateDate
seria a coluna que você precisa incluir. Caso contrário, você precisará listar explicitamente apenas as trêsID
colunas que deseja selecionar. SeCreateDate
for retornado, o índice a seguir o ajudará a evitar a Pesquisa de Chave.Crie um índice exclusivo embutido com inclusões, SQL Server 2019 e superior
Crie um índice exclusivo com inclusões, antes do SQL Server 2019
CRIAR ÍNDICE
Imagem maior
Existe algum motivo para se preocupar com essa pesquisa de chave específica? As pesquisas de chave geralmente são ruins, mas isso não significa que você sempre precisa se livrar delas toda vez que as encontrar. No seu caso, você está consultando uma tabela em uma coluna exclusiva. Isso deve sempre retornar, no máximo, uma linha. Assim, no máximo, tenha um Key Lookup. Eu não consideraria isso uma quantidade significativa de sobrecarga.
Meu ponto é, certifique-se de ter um "problema real" aqui, antes de tentar corrigi-lo.