我有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