मेरे पास तालिका है, जिसे कहा जाता है 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