Mam tabelę o nazwie Address
, która ma utrwaloną kolumnę obliczeniową o nazwie Hashkey
. Kolumna jest deterministyczna, ale nieprecyzyjna. Ma unikalny indeks, którego nie można zobaczyć. Jeśli uruchomię to zapytanie, zwracam klucz podstawowy:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Dostaję ten plan:
Jeśli wymuszę indeks, otrzymam ten jeszcze gorszy plan:
Jeśli spróbuję wymusić indeks i wyszukiwanie, pojawia się błąd:
Procesor zapytań nie mógł wygenerować planu zapytania ze względu na wskazówki zdefiniowane w tym zapytaniu. Ponownie wprowadź zapytanie bez podawania wskazówek i bez użycia
SET FORCEPLAN
Czy to tylko dlatego, że nie jest precyzyjne? Pomyślałem, że to nie ma znaczenia, czy to się utrzyma?
Czy istnieje sposób, aby ten indeks był widoczny bez zmieniania go w kolumnę nieobliczoną?
Czy ktoś ma jakieś linki do informacji na ten temat?
Nie mogę opublikować faktycznego utworzenia tabeli, ale oto tabela testowa, która ma ten sam problem:
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
źródło