Saya punya tabel, dipanggil Address
, yang memiliki kolom yang dihitung tetap disebut Hashkey
. Kolom bersifat deterministik tetapi tidak tepat. Ini memiliki indeks unik di atasnya yang tidak dapat dicari. Jika saya menjalankan kueri ini, mengembalikan kunci utama:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Saya mendapatkan rencana ini:
Jika saya memaksakan indeks saya mendapatkan rencana yang lebih buruk ini:
Jika saya mencoba dan memaksa indeks dan pencarian, saya mendapatkan kesalahan:
Prosesor kueri tidak dapat menghasilkan rencana kueri karena petunjuk yang ditentukan dalam kueri ini. Kirim ulang kueri tanpa menentukan petunjuk dan tanpa menggunakan
SET FORCEPLAN
Apakah ini hanya karena itu tidak tepat? Saya pikir itu tidak masalah jika itu bertahan?
Apakah ada cara untuk membuat indeks ini dapat dicari tanpa menjadikan ini kolom yang tidak dihitung?
Adakah yang punya tautan ke informasi tentang ini?
Saya tidak dapat memposting pembuatan tabel yang sebenarnya, tetapi di sini adalah tabel uji yang memiliki masalah yang sama:
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
sumber