Ich habe eine Tabelle aufgerufen Address
, die eine dauerhaft berechnete Spalte namens hat Hashkey
. Die Spalte ist deterministisch, aber nicht präzise. Es hat einen eindeutigen Index, der nicht auffindbar ist. Wenn ich diese Abfrage ausführe, wird der Primärschlüssel zurückgegeben:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Ich habe diesen Plan:
Wenn ich den Index erzwinge, erhalte ich diesen noch schlimmeren Plan:
Wenn ich versuche, sowohl den Index als auch eine Suche zu erzwingen, erhalte ich eine Fehlermeldung:
Der Abfrageprozessor konnte aufgrund der in dieser Abfrage definierten Hinweise keinen Abfrageplan erstellen. Wiederholen Sie die Abfrage ohne Angabe von Hinweisen und ohne Verwendung von
SET FORCEPLAN
Ist das nur so, weil es nicht präzise ist? Ich dachte, das wäre egal, wenn es bestehen bleibt?
Gibt es eine Möglichkeit, diesen Index suchbar zu machen, ohne dass dies eine nicht berechnete Spalte ist?
Hat jemand Links zu Informationen dazu?
Ich kann die tatsächliche Tabellenerstellung nicht veröffentlichen, aber hier ist eine Testtabelle, die das gleiche Problem aufweist:
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