Eu tenho uma tabela, chamada Address
, que tem uma coluna computada persistida chamada Hashkey
. A coluna é determinística, mas não precisa. Ele possui um índice exclusivo que não é procurável. Se eu executar esta consulta, retornando a chave primária:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Eu recebo este plano:
Se eu forçar o índice, recebo esse plano ainda pior:
Se eu tentar forçar o índice e uma busca, recebo um erro:
O processador de consultas não pôde produzir um plano de consulta devido às dicas definidas nesta consulta. Submeta novamente a consulta sem especificar nenhuma dica e sem usar
SET FORCEPLAN
Isso é só porque não é preciso? Eu pensei que não importava se isso persistisse?
Existe uma maneira de tornar esse índice pesquisável sem torná-lo uma coluna não computada?
Alguém tem links para informações sobre isso?
Não consigo postar a criação da tabela real, mas aqui está uma tabela de teste com o mesmo problema:
drop TABLE [dbo].[Test]
CREATE TABLE [dbo].[Test]
(
[test] [VARCHAR](100) NULL,
[TestGeocode] [geography] NULL,
[Hashkey] AS CAST(
( hashbytes
('SHA',
( RIGHT(REPLICATE(' ', (100)) + isnull([test], ''), ( 100 )) )
+ RIGHT(REPLICATE(' ', (100)) + isnull([TestGeocode].[ToString](), ''), ( 100 ))
)
) AS BINARY(20)
) PERSISTED
CONSTRAINT [UK_Test_HashKey] UNIQUE NONCLUSTERED([Hashkey])
)
GO
DECLARE @Hashkey BINARY(20)
SELECT [Hashkey]
FROM [dbo].[Test] WITH (FORCESEEK) /*Query processor could not produce a query plan*/
WHERE [Hashkey] = @Hashkey
fonte