मैं एक दोहरी आत्म में शामिल होने के प्रश्न हैं जहां प्रदर्शन गंभीर रूप से अवक्रमित है जब खोज मूल्यों लगा दिया जाता था।एसक्यूएल क्वेरी प्रदर्शन में खराबी आ खोजें के आदेश के आधार पर मानों
-- 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 के साथ दोनों टेबलों पर अद्यतन किए गए थे।
एसक्यूएल क्वेरी ऑप्टिमाइज़र सही ढंग से क्यों नहीं पहचानता है कि दोनों मामलों में आंतरिक योजना में सबसे अधिक पंक्तियों में शामिल होने वाली पंक्तियों में से एक होना चाहिए?
मानदंडों का उपयोग करें जो आपकी क्वेरी में पंक्तियों की संख्या को सबसे पहले सीमित करते हैं। यह अंगूठे का एक सामान्य नियम है। – JonH
संभावित उत्तर: क्वेरी पैरामीटर, पैरामीटर स्नीफिंग और योजना पुन: उपयोग। –
क्या आप foo और बार तालिकाओं पर प्राथमिक कुंजी कुंजी बना सकते हैं? –