Ben denilen bir tablo var denilen Address
kalıcı bir hesaplanmış sütun var Hashkey
. Sütun deterministiktir, ancak kesin değildir. Üzerinde aranamayan benzersiz bir indeks vardır. Bu sorguyu çalıştırırsam, birincil anahtarı döndürürseniz:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Bu planı alıyorum:
Eğer indeksi zorlarsam, bu daha kötü bir plan elde ederim:
Denemek ve hem dizin hem de bir arama zorlamak, bir hata alıyorum:
Sorgu işlemcisi, bu sorguda tanımlanan ipuçları nedeniyle bir sorgu planı üretemedi. Herhangi bir ipucu belirtmeden ve kullanmadan sorguyu yeniden gönderin
SET FORCEPLAN
Bu sadece kesin olmadığı için mi? Bunun devam edip etmediğinin önemli olmadığını düşündüm.
Bu dizini hesaplanmamış bir sütun haline getirmeden aranabilir kılmanın bir yolu var mı?
Herkes bu konuda bilgi bağlantıları var mı?
Gerçek tablo oluşturma gönderemiyorum, ama burada aynı sorunu olan bir test tablosu:
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