У меня есть таблица с именем Address
, которая имеет сохраненный вычисляемый столбец с именем Hashkey
. Столбец является детерминированным, но не точным. У него есть уникальный индекс, который нельзя найти. Если я запускаю этот запрос, возвращая первичный ключ:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Я получаю этот план:
Если я форсирую индекс, я получаю еще худший план:
Если я пытаюсь форсировать индекс и поиск, я получаю сообщение об ошибке:
Обработчику запросов не удалось создать план запроса из-за подсказок, определенных в этом запросе. Повторите запрос без указания каких-либо подсказок и без использования
SET FORCEPLAN
Это только потому, что это не точно? Я думал, что это не имеет значения, если это было продолжено?
Есть ли способ сделать этот индекс доступным для поиска, не делая этот столбец не вычисляемым?
У кого-нибудь есть ссылки на информацию по этому поводу?
Я не могу опубликовать фактическое создание таблицы, но вот тестовая таблица с той же проблемой:
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
источник