Tengo una tabla, llamada Address
, que tiene una columna calculada persistente llamada Hashkey
. La columna es determinista pero no precisa. Tiene un índice único que no se puede buscar. Si ejecuto esta consulta, devolviendo la clave primaria:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Me sale este plan:
Si fuerzo el índice me sale este plan aún peor:
Si intento forzar tanto el índice como la búsqueda, obtengo un error:
El procesador de consultas no pudo generar un plan de consulta debido a las sugerencias definidas en esta consulta. Vuelva a enviar la consulta sin especificar ninguna pista y sin usar
SET FORCEPLAN
¿Es esto solo porque no es preciso? Pensé que no importaba si persistía?
¿Hay alguna manera de hacer que este índice sea buscable sin hacer de esta una columna no calculada?
¿Alguien tiene algún enlace a información sobre esto?
No puedo publicar la creación de la tabla real, pero aquí hay una tabla de prueba que tiene el mismo 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
fuente