PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgresql join_collapse_limit और क्वेरी प्लानिंग का समय

PostgreSQL का नया 9.4 संस्करण (इस लेखन के समय अभी तक जारी नहीं किया गया है) योजना के समय को EXPLAIN में जोड़ने जा रहा है और EXPLAIN ANALYZE , और इसलिए आप उनका उपयोग कर पाएंगे।

पुराने संस्करणों के लिए, आपकी धारणा सही है, योजना समय निर्धारित करने का बेहतर तरीका एक सरल EXPLAIN निष्पादित करना है (कोई ANALYZE ) और इसमें लगने वाले समय की जांच psql . में करें आप इसे \timing . को सक्षम करके कर सकते हैं (मैं आमतौर पर ~/.psqlrc . पर ऐसा करता हूं )।

PostgreSQL हैकर्स टीम ने पहले ही इसे बड़े मूल्यों तक बढ़ाने के बारे में चर्चा की थी . लेकिन ऐसा लगता है कि वे इस बात की गारंटी नहीं दे सकते कि यह सभी मामलों के लिए अच्छा होगा।

समस्या यह है कि N . के लिए सर्वश्रेष्ठ जॉइन ऑर्डर खोजने की योजना बना रहे हैं टेबल एक O(N!) takes लेता है (तथ्यात्मक) दृष्टिकोण। और इसलिए, वृद्धि की संख्या बहुत अधिक है, आप इसे निम्न क्वेरी के साथ आसानी से देख सकते हैं:

$ SELECT i, (i)! AS num_comparisons FROM generate_series(8, 20) i;
 i  |   num_comparisons   
----+---------------------
  8 |               40320
  9 |              362880
 10 |             3628800
 11 |            39916800
 12 |           479001600
 13 |          6227020800
 14 |         87178291200
 15 |       1307674368000
 16 |      20922789888000
 17 |     355687428096000
 18 |    6402373705728000
 19 |  121645100408832000
 20 | 2432902008176640000
(13 rows)

जैसा कि आप देख सकते हैं, 8 के डिफ़ॉल्ट पर हम लगभग 40K तुलना करते हैं, आपके द्वारा प्रस्तावित 10 इसे 3M तक ले जाता है, जो अभी भी आधुनिक कंप्यूटरों के लिए बहुत अधिक नहीं है, लेकिन अगले मान बहुत बड़े होने लगते हैं, यह बस बढ़ जाता है बहुत तेज़, 20 बस पागल है (21! 64 बिट पूर्णांक भी फिट नहीं बैठता)।

बेशक, कभी-कभी आप इसे 16 जैसे बड़े मूल्यों पर सेट कर सकते हैं, जो (सिद्धांत रूप में) लगभग 20 ट्रिलियन तुलना कर सकते हैं, और अभी भी बहुत अच्छा नियोजन समय है, ऐसा इसलिए है क्योंकि पोस्टग्रेएसक्यूएल ने योजना बनाते समय कुछ रास्ते काट दिए हैं और इसकी आवश्यकता नहीं है करने के लिए हमेशा सभी आदेशों की जांच करें, लेकिन यह मानते हुए कि यह हमेशा मामला रहेगा और ऐसे उच्च मूल्यों को डिफ़ॉल्ट बना देगा, मेरे लिए एक अच्छा दृष्टिकोण नहीं दिखता है। भविष्य में कुछ अनपेक्षित प्रश्न हो सकते हैं जो सभी आदेशों की जांच करने के लिए जाते हैं और फिर आपके पास केवल एक ही क्वेरी होती है जो आपके सर्वर को बंद कर देती है।

मेरे अनुभव में, मैं अच्छे सर्वर में किसी भी इंस्टॉलेशन पर 10 को डिफ़ॉल्ट मान के रूप में मानता हूं, उनमें से कुछ मैं 12 का भी उपयोग करता हूं। मैं आपको इसे 10 पर सेट करने की सलाह देता हूं, और कभी-कभी, इसे उच्च सेट करने का प्रयास करें ( मैं 12 से आगे नहीं जाऊंगा) और यह कैसे व्यवहार करता है यह देखने के लिए निगरानी (बारीकी से) करता हूं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मेरा स्कीमा आकार क्यों नहीं देख सकता

  2. PostgreSQL खोज और प्रतिस्थापित करें जहां स्थिति

  3. जब Django postgresql के साथ क्रमबद्ध लेनदेन अलगाव स्तर का उपयोग कर रहा है तो कौन से विशिष्ट अपवाद क्रमबद्धता विफलता का प्रतिनिधित्व करते हैं?

  4. शामिल नहीं हो सकता और अगली कड़ी में चयन नहीं कर सकता -- PG::SyntaxError

  5. PostgreSQL में एक साथ कई लेनदेन कैसे चलाएं