Tôi có bảng, được gọi Address
, có một cột được tính toán bền vững được gọi Hashkey
. Cột là xác định nhưng không chính xác. Nó có một chỉ số duy nhất trên đó là không thể tìm kiếm. Nếu tôi chạy truy vấn này, trả về khóa chính:
SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Tôi có kế hoạch này:
Nếu tôi buộc chỉ số, tôi nhận được kế hoạch thậm chí còn tồi tệ hơn:
Nếu tôi cố gắng và buộc cả chỉ mục và tìm kiếm, tôi sẽ gặp lỗi:
Bộ xử lý truy vấn không thể tạo ra một kế hoạch truy vấn vì các gợi ý được xác định trong truy vấn này. Gửi lại truy vấn mà không chỉ định bất kỳ gợi ý nào và không sử dụng
SET FORCEPLAN
Đây có phải chỉ vì nó không chính xác? Tôi nghĩ rằng nó không quan trọng nếu nó vẫn tồn tại?
Có cách nào để làm cho chỉ mục này có thể tìm kiếm mà không làm cho cột này không được tính toán không?
Có ai có bất kỳ liên kết đến thông tin về điều này?
Tôi không thể đăng việc tạo bảng thực tế, nhưng đây là bảng thử nghiệm có cùng một vấn đề:
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