2012-05-15 9 views
5

मैं एक दोहरी आत्म में शामिल होने के प्रश्न हैं जहां प्रदर्शन गंभीर रूप से अवक्रमित है जब खोज मूल्यों लगा दिया जाता था।एसक्यूएल क्वेरी प्रदर्शन में खराबी आ खोजें के आदेश के आधार पर मानों

-- 500,000 i/o & 500ms execution 
select 
    fooA.ID 
    , fooB.ID 
from 
    foo AS fooA 
    INNER JOIN bar AS barA ON fooA.barID = barA.barID 
    INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join 
    INNER JOIN bar AS barB ON fooB.barID = barB.barID 
where 
    barA.value = 'xyz' 
    AND barB.value = '60' 

-- 5,000 i/o & 5ms execution 
select 
    fooA.ID 
    , fooB.ID 
from 
    foo AS fooA 
    INNER JOIN bar AS barA ON fooA.barID = barA.barID 
    INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join 
    INNER JOIN bar AS barB ON fooB.barID = barB.barID 
where 
    barA.value = '60' 
    AND barB.value = 'xyz' 
  • मूल्य में "xyz" "बार" तालिका में सूचीबद्ध है 150,000 बार।
  • "बार" तालिका में मान "60" 500 बार सूचीबद्ध है।
  • क्वेरी प्लान समान हैं, सिवाय इसके कि आंतरिक-अधिकांश लूप 150,000 पंक्तियां या 500 पंक्तियां देता है, जो कि खोज मूल्य पहले सूचीबद्ध होता है।
  • खोज निष्पादित गैर-क्लस्टर इंडेक्स पर खोज करती है।
  • आंकड़े FULLSCAN के साथ दोनों टेबलों पर अद्यतन किए गए थे।

एसक्यूएल क्वेरी ऑप्टिमाइज़र सही ढंग से क्यों नहीं पहचानता है कि दोनों मामलों में आंतरिक योजना में सबसे अधिक पंक्तियों में शामिल होने वाली पंक्तियों में से एक होना चाहिए?

+0

मानदंडों का उपयोग करें जो आपकी क्वेरी में पंक्तियों की संख्या को सबसे पहले सीमित करते हैं। यह अंगूठे का एक सामान्य नियम है। – JonH

+1

संभावित उत्तर: क्वेरी पैरामीटर, पैरामीटर स्नीफिंग और योजना पुन: उपयोग। –

+0

क्या आप foo और बार तालिकाओं पर प्राथमिक कुंजी कुंजी बना सकते हैं? –

उत्तर

3

SQL सर्वर प्रत्येक बार निष्पादित होने पर एक क्वेरी को पुन: संकलित नहीं करता है। यह एक बार ऐसा करता है, और यह पहली बार देखे जाने वाले सटीक मानों के लिए अनुकूलित किया जाता है। मुझे लगता है कि आपके पास एक दुर्भाग्यपूर्ण योजना कैश है।

अंत में OPTION (RECOMPILE) जोड़ने का प्रयास करें।

+0

मैंने इसे जोड़ा और कोई बदलाव नहीं हुआ। आंतरिक पूछताछ से पंक्तियों की अनुमानित संख्या दोनों प्रश्न योजनाओं के लिए 2,500 है, लेकिन वास्तविक व्यापक रूप से भिन्न है। –

+0

यह अजीब बात है। समानता मिलान के लिए सूचकांक पर कार्डिनलिटी अनुमान आमतौर पर बहुत सटीक होता है। क्या आप जिन टेबलों पर जा रहे हैं उनमें बहुत कम संख्या में पंक्तियों के साथ पंक्तियों की बहुत अधिक संख्या है? – usr

+0

मैं वास्तव में कुछ भी देखने में असफल रहा जो यहां परेशानी पैदा कर सकता है। क्या आप दो वास्तविक निष्पादन योजनाओं के स्क्रीनशॉट पोस्ट कर सकते हैं? – usr

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