मेरे पास पोस्टग्रेस्क्ल 9.2 सिस्टम पर एक क्वेरी है जो इसके सामान्य रूप में लगभग 20s लेती है लेकिन सीटीई का उपयोग करते समय केवल ~ 120ms लेती है।क्या सीटीई का उपयोग किये बिना इस प्रश्न का तार्किक रूप से समतुल्य और कुशल संस्करण है?
मैंने ब्रेवटी के लिए दोनों प्रश्नों को सरल बनाया।
यहाँ सामान्य रूप है (20 के बारे में लेता है): http://explain.depesz.com/s/2v8
CTE प्रपत्र (के बारे में 120ms):
WITH raw AS (
SELECT *
FROM tableA
WHERE (columna = 1 OR columnb = 2) AND
atype = 35 AND
aid IN (1, 2, 3)
)
SELECT *
FROM raw
ORDER BY modified_at DESC
LIMIT 25;
SELECT *
FROM tableA
WHERE (columna = 1 OR columnb = 2) AND
atype = 35 AND
aid IN (1, 2, 3)
ORDER BY modified_at DESC
LIMIT 25;
यहाँ इस प्रश्न के लिए समझाने है सीटीई के लिए यहां बताया गया है: http://explain.depesz.com/s/uxy
बस चलकर ORDER BY
क्वेरी के बाहरी हिस्से में 99% की लागत कम कर देता है।
मेरे पास दो प्रश्न हैं: 1) सीटीई का उपयोग किए बिना पहली क्वेरी बनाने का कोई तरीका है कि यह तर्कसंगत रूप से अधिक प्रदर्शन करने वाला है और 2) प्रदर्शन में यह अंतर क्या कहता है कि योजनाकार कैसे है डेटा लाने के लिए निर्धारित करना?
उपरोक्त प्रश्नों के बारे में, क्या अतिरिक्त आंकड़े या अन्य योजनाकार संकेत हैं जो पहली क्वेरी के प्रदर्शन में सुधार करने में मदद करेंगे?
संपादित करें: सीमा को दूर करने से क्वेरी को एक इंडेक्स स्कैन के विपरीत एक हीप स्कैन का उपयोग करने का कारण बनता है। LIMIT
के बिना क्वेरी 40ms में पूर्ण हो जाती है।
आदि LIMIT
के प्रभाव मैं LIMIT 1
साथ की कोशिश की, LIMIT 2
, देखने के बाद क्वेरी जब LIMIT 1
और 10s + LIMIT
> 1.
साथ उपयोग करते हुए इस में कुछ और, सवाल 2 फोड़े के बारे में सोच करने के बाद 100ms के तहत में प्रदर्शन प्लानर एक मामले में पीछे एक इंडेक्स स्कैन का उपयोग क्यों करता है और बिटमैप हीप स्कैन + किसी अन्य तर्कसंगत समकक्ष मामले में सॉर्ट करता है? और प्लानर दोनों मामलों में कुशल योजना का उपयोग करने में "सहायता" कैसे कर सकता हूं?
अद्यतन: मैं क्रेग की जवाब स्वीकार किए जाते हैं, क्योंकि यह सबसे व्यापक और मददगार था। जिस तरह से मैंने समस्या को हल करने का अंत किया था, वह एक क्वेरी का उपयोग करके व्यावहारिक रूप से समकक्ष था, हालांकि तर्कसंगत समकक्ष नहीं था। इस मुद्दे की जड़ पर संशोधित_एट पर सूचकांक के पीछे एक सूचकांक स्कैन था। योजनाकार को सूचित करने के लिए कि यह एक अच्छा विचार नहीं था, मैं WHERE modified_at >= NOW() - INTERVAL '1 year'
रूप का एक अनुमान जोड़ता हूं। इसमें एप्लिकेशन के लिए पर्याप्त डेटा शामिल था लेकिन प्लानर को पिछड़ा इंडेक्स स्कैन पथ नीचे जाने से रोका।
यह एक बहुत कम प्रभाव समाधान था जो उप-क्वेरी या सीटीई का उपयोग कर क्वेरी को फिर से लिखने की आवश्यकता को रोकता था। YMMV।
धन्यवाद, हालांकि मैंने इस संपत्ति का लाभ उठाया है (यह बिंदु में एक मामला है) मुझे नहीं पता था कि PostgreSQL सीटीई सीमाओं में अनुकूल नहीं है। यदि आप प्रदान की गई समझाई गई योजनाओं को देखते हैं, तो ऐसा नहीं लगता है कि 'work_mem' की महत्वपूर्ण मात्रा का उपयोग किया जा रहा है (~ 25k)। अधिकांश लागत इंडेक्स स्कैन से पीछे की ओर आ रही है। – drsnyder
@drsnyder ओह! मैंने गलत पढ़ लिया! 20s और 120ms। मैं उचित उत्तर को फिर से पढ़ और समायोजित कर दूंगा। –
@drsnyder पुनः लिखित। उम्मीद है कि अधिक समझ में आता है। कृपया http://wiki.postgresql.org/wiki/Server_Configuration के आउटपुट को केवल यह पुष्टि करने के लिए दिखाएं कि आपके पास कोई 'enable_' पैराम, आदि नहीं है, लेकिन यह योजनाकार द्वारा थोड़ी सी पसंद की तरह दिखता है। –