という名前のテーブルがあり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