У мене є таблиця, що називається 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