अनुक्रमित संगणित स्तंभ पर अनुक्रमणिका प्राप्य नहीं है


15

मेरे पास तालिका है, जिसे कहा जाता है Address, जिसमें एक स्थायी गणना वाला कॉलम है Hashkey। स्तंभ निर्धारक है लेकिन सटीक नहीं है। यह उस पर एक अद्वितीय सूचकांक है जो खोज योग्य नहीं है। यदि मैं यह कुंजी चलाता हूं, तो प्राथमिक कुंजी लौटाता हूं:

SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey

मुझे यह योजना मिलती है:

BasicPlan

यदि मैं इंडेक्स को बाध्य करता हूं तो मुझे इससे भी बदतर योजना मिलती है:

ForceIndex

यदि मैं कोशिश करता हूं और सूचकांक और तलाश दोनों को मजबूर करता हूं, तो मुझे एक त्रुटि मिलती है:

क्वेरी प्रोसेसर इस क्वेरी में परिभाषित संकेतों के कारण क्वेरी प्लान नहीं बना सकता है। किसी भी संकेत को निर्दिष्ट किए बिना और उपयोग किए बिना क्वेरी को पुनः सबमिट करें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 

जवाबों:


12

समस्या इस तथ्य से संबंधित प्रतीत होती है कि डेटाटाइप ( ) [TestGeocode].[ToString]()लौटाता है ।maxnvarchar(max)

मैं भी इस सरल संस्करण के साथ समस्या का सामना कर रहा हूं ( इसे हल करने के बजाय परिभाषा को बदल रहा c1है varchar(8000)या उपयोग कर रहा है)COALESCEISNULL

DROP TABLE dbo.Test

CREATE TABLE dbo.Test
  (
     c1        VARCHAR(
                          MAX    --Fails
                        --  8000 --Works fine
                          ) NULL,
     comp1 AS CAST(ISNULL(c1, 'ABC') AS VARCHAR(100))
    CONSTRAINT UK_Test_comp1 UNIQUE NONCLUSTERED(comp1)
  )

GO

DECLARE @comp1 VARCHAR(100)

SELECT comp1
FROM   dbo.Test WITH (FORCESEEK)
WHERE  comp1 = @comp1 
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606); 

गणना किए गए स्तंभ संदर्भ अंतर्निहित परिभाषा तक विस्तारित हो जाते हैं और फिर बाद में स्तंभ से मेल खाते हैं। यह गणना किए गए स्तंभों को बिना किसी नाम के उल्लेख के बिना मिलान करने की अनुमति देता है और अंतर्निहित परिभाषाओं पर सरलीकरण की अनुमति देता है।

ISNULLपहले पैरामीटर का डेटाटाइप लौटाता है ( VARCHAR(MAX)मेरे उदाहरण में)। की वापसी प्रकार COALESCEहो जाएगा VARCHAR(MAX)यहाँ भी है, लेकिन यह एक तरीका है कि समस्या से बचा जाता है में अलग ढंग से मूल्यांकन किया जा रहा है।

उन मामलों में जहां क्वेरी सफल होती है ट्रेस ध्वज आउटपुट में निम्न शामिल हैं

ScaOp_Convert varchar(max) collate 49160,Null,Var,Trim,ML=65535

    ScaOp_Const TI(varchar collate 49160,Var,Trim,ML=3) 
                      XVAR(varchar,Owned,Value=Len,Data = (3,ABC))

जहां यह विफल हो जाता है, इसके द्वारा प्रतिस्थापित किया जाता है

ScaOp_Identifier COL: ConstExpr1003 

मैं अनुमान लगाता हूं कि जिन मामलों में यह विफल होता है (निहित) CAST('ABC' AS VARCHAR(MAX))सिर्फ एक बार किया जाता है और इसका मूल्यांकन एक रनटाइम स्थिरांक ( अधिक जानकारी ) के रूप में किया जाता है । हालाँकि, इस रनटाइम स्थिर लेबल का संदर्भ, वास्तविक स्ट्रिंग शाब्दिक मान के बजाय, इसे गणना किए गए स्तंभ परिभाषा से मेल खाने से रोकता है।

यह आपकी क्वेरी में समस्या को फिर से लिखने से बचता है

CREATE TABLE [dbo].[Test]
  (
     [test]        [VARCHAR](100) NULL,
     [TestGeocode] [geography] NULL,
     [Hashkey] AS CAST(
                        ( hashbytes
                            ('SHA', 
                                ( RIGHT(SPACE(100) + isnull([test], ''), 100) ) 
                                + RIGHT(SPACE(100) + isnull(CAST(RIGHT([TestGeocode].[ToString](),100) AS VARCHAR(100)), ''),100)
                            ) 
                        ) AS BINARY(20)                                                                                                        
                      ) PERSISTED
    CONSTRAINT [UK_Test_HashKey] UNIQUE NONCLUSTERED([Hashkey])
  )

0

यदि एक प्रकार का डेटा @HashKeyअनुक्रमित स्तंभ से मेल नहीं खाता है, तो आपको एक गैर-सारगर्भित अभिव्यक्ति के कारण ये लक्षण मिलेंगे । CASTवांछित डेटा प्रकार के साथ तालमेल करने के लिए आपको गणना किए गए कॉलम की अभिव्यक्ति में एक स्पष्ट आवश्यकता हो सकती है ।

आपके रेप्रो के आधार पर, मुझे संदेह है कि यह एक बग है। मैंने मार्टिन के वर्कअराउंड के एक संस्करण के साथ एक कनेक्ट बग, कंप्यूटेड कॉलम इंडेक्स नॉट यूज्ड फाइल किया । वोट देने के लिए स्वतंत्र महसूस करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.