PostgreSQL के GEQO (जेनेटिक क्वेरी ऑप्टिमाइज़ेशन) में संशोधन


16

मुझे एक कार्यक्षमता को लागू करने की आवश्यकता है जो पोस्टग्रेक्यूएल के GEQO कार्यक्षमता के अनुरूप है। मैं समझता हूं कि GEQO दृष्टिकोण क्वेरी योजनाओं को पूर्णांक स्ट्रिंग्स के रूप में एन्कोड करने के लिए है और GEQO इन संभावित सम्मिलित अनुक्रमों को यादृच्छिक रूप से उत्पन्न करता है। स्रोत: http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html

मेरा प्रश्न: अगर मैं निश्चित रूप से सही जॉइन अनुक्रम को जानता हूं, तो GEQO फ़ंक्शन को कैसे संशोधित किया जाए, ताकि मुझे अलग-अलग दृश्यों की खोज न करनी पड़े। उदाहरण के लिए, अगर मुझे पता था कि 4 संबंधों में शामिल होने का सबसे अच्छा तरीका 4-1-3-2 है, तो मुझे अन्य अनुमति के लिए जांच करने की आवश्यकता नहीं है।

PostgreSQL में GEQO कैसे कार्यान्वित किया जाता है, इस पर कोई अच्छी सामग्री नहीं है। PostgreSQL केवल GEQO कार्यक्षमता का समग्र दृश्य देता है, लेकिन ज्यादा व्याख्या नहीं करता है।

या क्या मैं GEQO का उपयोग किए बिना ही इस कार्यक्षमता को standard_join_search () में प्राप्त कर सकता हूं?


3
ऐसा लगता है कि आप क्वेरी संकेत लागू करना चाहते हैं। यह सब अच्छी तरह से और अच्छा है, लेकिन आपको पोस्टग्रेएसक्यूएल कोर में स्वीकार किए गए परिवर्तन को प्राप्त करने की उम्मीद नहीं करनी चाहिए क्योंकि परियोजना समुदाय वह नहीं है जिसे आप क्वेरी संकेत का एक बड़ा प्रशंसक कहेंगे। यदि आप इस बारे में गंभीर हैं, तो आपको क्वेरी प्लानर कोड का एक बहुत कुछ पढ़ने की आवश्यकता होगी और आपको यह पता लगाने की आवश्यकता होगी कि कैसे अपने संकेत पार्सर से नीचे राइटर के माध्यम से और प्लानर में पास करें। मैं यहाँ एक त्वरित और सरल जवाब नहीं देखता। आप अंततः क्या करना चाहते हैं, वह योजनाकार / ऑप्टिमाइज़र में एक विशेष पथ विकल्प को मजबूर करता है।
क्रेग रिंगर

आह, हाँ वे क्वेरी संकेत के बारे में उलझन में हैं। मैंने योजनाकार कोड का पठन किया है और ऐसा लगता है कि GEQO मौजूदा कोर में परिवर्तनों को कम करने का एक तरीका होगा।
user2761431

2
क्या वह है जिसे आप प्राप्त करने की कोशिश कर रहे हैं, ताकि आदेश में शामिल होने के लिए बलपूर्वक संकेत को लागू किया जा सके? यदि हां, तो इस पर गौर करें कि क्या किसी और ने इसे लागू किया है। आपको यह भी विचार करना चाहिए कि आपको इसकी आवश्यकता क्यों है, योजनाकार पहले स्थान पर गलत विकल्प क्यों बना रहा है। एक आत्म निहित परीक्षण मामले का निर्माण करने और pgsql- प्रदर्शन की रिपोर्टिंग पर विचार करें।
क्रेग रिंगर

3
नहीं है pg_hint_plan : en.sourceforge.jp/projects/pghintplan , लेकिन मैं इसका इस्तेमाल नहीं किया। एक dba ने मुझे बताया कि यह 9.2 पर काम कर रहा था। इसके बारे में रूसी में लेख भी है habrahabr.ru/post/169751
ckorzhik

जवाबों:


1

एक तरह से आप GEKO के साथ गड़बड़ करने की आवश्यकता के बिना CTE का उपयोग करके ऐसा कर सकते हैं।

CTE ऑप्टिमाइज़ेशन बैरियर हैं, इसलिए आप अपने इच्छित ऑर्डर में CTE के अंदर जॉइन लपेट सकते हैं और PG को ऐसा करने के लिए मजबूर किया जाएगा।

उदाहरण के लिए, यदि हम DB को पहले t2 के साथ t1 में शामिल होने के लिए बाध्य करना चाहते हैं और उसके बाद ही t4 के साथ हम कुछ ऐसा चला सकते हैं:

explain 
with j1 as (select *,t1.c4 as t1c4 from t1 join t2 on (t1.c2=t2.id))
    ,j2 as (select * from j1 join t4 on (t1c4=t4.id))
select * from j2;

इसका परिणाम यह होगा:

                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
CTE Scan on j2  (cost=51485.00..67785.00 rows=815000 width=64)
CTE j1
 ->  Hash Join  (cost=3473.00..14521.00 rows=815000 width=40)
       Hash Cond: (t2.id = t1.c2)
       ->  Seq Scan on t2  (cost=0.00..26.30 rows=1630 width=20)
       ->  Hash  (cost=1637.00..1637.00 rows=100000 width=20)
             ->  Seq Scan on t1  (cost=0.00..1637.00 rows=100000 width=20)
CTE j2
 ->  Hash Join  (cost=289.00..36964.00 rows=815000 width=64)
       Hash Cond: (j1.t1c4 = t4.id)
       ->  CTE Scan on j1  (cost=0.00..16300.00 rows=815000 width=44)
       ->  Hash  (cost=164.00..164.00 rows=10000 width=20)
             ->  Seq Scan on t4  (cost=0.00..164.00 rows=10000 width=20)
(13 rows)

यह सिर्फ एक उदाहरण है, आप इसे आवश्यकतानुसार बदल सकते हैं - किसी भी स्थिति में पीजी विभिन्न सीटीई के बीच आदेश को बदल नहीं सकता है।

आशा करता हूँ की ये काम करेगा :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.