2012-10-18 9 views
11

हम जहां इसके खिलाफ सभी प्रश्नों देखने के बीच एक होना Column1 और Column2 का उपयोग कर होगा दो लाख से अधिक पंक्तियों के साथ एक मेज है। इसके अलावा, केवल एक संभावित परिणाम होगा। उदाहरण के लिए ...केवल एक मैच के साथ क्वेरी के बीच एसक्यूएल अनुक्रमण?

Col1  Col2 
1  5 
6  10 
11  15 

select * from table1 where 8 between Col1 and Col2 

मैं वर्तमान में Col1 और Col2 पर एक अनन्य संकुल अनुक्रमणिका है। अब तक मैं यह पता लगाने में असमर्थ हूं कि क्वेरी और इंडेक्स को पंक्तियों को कम करने के लिए कैसे आगे बढ़ना है। निष्पादन योजना वर्तमान में एक और एकमात्र सही उत्तर का पता लगाने के दौरान लगभग 0.5 और 113k पंक्तियों की लागत की रिपोर्ट करती है।

मुझे कौन से विकल्प दिख रहे हैं?

के रूप में अनुरोध किया है, वर्तमान कार्य योजना लागू से कुछ विवरण:

Operation 
Clustered Index Seek 
Predicate 
CONVERT_IMPLICIT(bigint,[@2],0)<=[Col2] 
Seek Predicate 
Seek Keys[1]: End: Col1 <= Scalar Operator(CONVERT_IMPLICIT(bigint,[@1],0)) 
+0

क्या यह इसे 'तालिका * से चुनें * जहां से कॉल 1 = < 8 and Col2> = 8' – Vicki

+0

क्या कॉल 1 में हमेशा चरण 5 है? यदि ऐसा है तो उत्तर सरल है :) –

+0

आपके द्वारा निष्पादन योजना की तरह क्या दिखता है? क्या आप इसे प्रश्न में जोड़ सकते हैं? –

उत्तर

3

मुझे लगता है कि मुझे जवाब मिल गया है। मुझे Col1 पर एक अनन्य क्लस्टर्ड इंडेक्स बनाना शुरू करना था, फिर Col2 पर एक अनन्य अनक्स्टर्ड इंडेक्स बनाएं। तब क्वेरी को प्रत्येक इंडेक्स पर लुकअप को मजबूर करने के लिए अपडेट किया जाना था।

select * from table1 where Col1 = 
    (select max(Col1) from table1 where Col1 <= 8) 
and Col2 = 
    (select min(Col2) from table1 where Col2 >= 8) 

निष्पादन योजना अब 0.00 9 8 लागत और 1 पंक्ति को संभाला गया है।

1
select * from table1 where Col1 <= 8 and Col2 >= 8 

हो सकता है कि दो स्तंभों के साथ "के बीच" वजह से समस्या आ रही है।

इसके अलावा, आप सिर्फ दोनों कॉलम (Col1, Col2) पर 1 समग्र सूचकांक होना चाहिए।

6

क्या श्रेणियां हमेशा गैर-ओवरलैपिंग होती हैं? आप उल्लेख करते हैं कि हमेशा एक ही मैच होता है। वे कर रहे हैं, तो आप इसे लिख सकते हैं:

SELECT * FROM table1 
    WHERE 8 <= Col2 
    ORDER BY Col2 ASC 
    LIMIT 1 

यह आपको Col2 के निम्नतम मूल्य जो 8 से ऊपर है के साथ पंक्ति दे देंगे - जो सीमा आप में रुचि रखते हैं सूचकांक पर ही की जरूरत होगी है। Col2, और लागत छोटी होनी चाहिए।

चूंकि आपने जिस डीबीएमएस का उपयोग कर रहे हैं उसका उल्लेख नहीं किया है, इसलिए LIMIT 1 को आपके पहले डी परिणामों को लाने के लिए जो भी डीबी उपयोग करता है, उसके साथ प्रतिस्थापित किया जाना चाहिए।

आप कोड में Col1 <= your_value की जाँच करने के लिए सुनिश्चित करें कि आप जो मान वास्तव में देख रहे हैं सीमा में है होगा।

संबंधित मुद्दे