Ho una tabella, chiamata Address
, che ha una colonna calcolata persistente chiamata Hashkey
. La colonna è deterministica ma non precisa. Ha un indice univoco su di esso che non è ricercabile. Se eseguo questa query, restituendo la chiave primaria:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Ricevo questo piano:
Se forzo l'indice ottengo questo piano ancora peggiore:
Se provo a forzare sia l'indice che una ricerca, viene visualizzato un errore:
Il processore di query non è stato in grado di produrre un piano di query a causa dei suggerimenti definiti in questa query. Reinvia la query senza specificare alcun suggerimento e senza utilizzare
SET FORCEPLAN
È solo perché non è preciso? Ho pensato che non importava se fosse persistito?
C'è un modo per rendere questo indice ricercabile senza renderlo una colonna non calcolata?
Qualcuno ha collegamenti a informazioni su questo?
Non riesco a pubblicare la creazione della tabella effettiva, ma ecco una tabella di test che presenta lo stesso 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