J'ai une table, appelée Address
, qui a une colonne calculée persistante appelée Hashkey
. La colonne est déterministe mais pas précise. Il contient un index unique qui n'est pas recherché. Si j'exécute cette requête, en renvoyant la clé primaire:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Je reçois ce plan:
Si je force l'index, j'obtiens ce plan encore pire:
Si j'essaie de forcer l'index et une recherche, j'obtiens une erreur:
Le processeur de requêtes n'a pas pu produire un plan de requête en raison des indications définies dans cette requête. Renvoyez la requête sans spécifier d'indices et sans utiliser
SET FORCEPLAN
Est-ce juste parce que ce n'est pas précis? Je pensais que ça n'avait pas d'importance si ça persistait?
Existe-t-il un moyen de rendre cet index recherchable sans en faire une colonne non calculée?
Quelqu'un at-il des liens vers des informations à ce sujet?
Je ne peux pas publier la création de table réelle, mais voici une table de test qui a le même problème:
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
la source