2012-07-25 17 views
5

ब्रूस Momjian के ब्लॉग पोस्ट में Generating Random Data Via SQL वह 5 यादृच्छिक तार उत्पन्न करने के लिए निम्न कोड का इस्तेमाल किया। जब मैंने इसे हटा दिया, तो परिणाम 5 बिल्कुल समान स्ट्रिंग्स में बदल गया जिसका अर्थ है कि पोस्टग्रेस ने बाहरी चयन अभिव्यक्ति (परिणाम) को कैश किया!PostgreSQL अस्थिर भाव और सबक्वेरी

मुझे नहीं पता कि पोस्टग्रेज़ में अभिव्यक्ति कैशिंग कैसे काम कर रही है। the documentation के अनुसार यादृच्छिक() फ़ंक्शन को वोल्टाइली चिह्नित किया गया है, इसलिए, मुझे उम्मीद है कि कोई भी अभिव्यक्ति इस पर निर्भर करती है कि यह अस्थिर भी हो।

पोस्टग्रेज़ में अभिव्यक्ति कैशिंग कैसे काम करता है? क्या यह कहीं भी दस्तावेज है? क्यों 'बी * 0' ने कैश को अक्षम किया जहां यादृच्छिक() नहीं था?

अद्यतन:

मुद्दे का अध्ययन करने के लिए, मैं के लिए चले गए 'बी * 0' मंजिल के अंदर() के रूप में यादृच्छिक एक ही स्थिति/स्तर पर होना करने के लिए कॉल():

... 
       SELECT chr(ascii('a') + floor(random() * 26 + b * 0)::integer) 
       FROM generate_series(1, 40) as s(f) 
... 

परिणाम अभी भी कैश नहीं है; विभिन्न तार

अद्यतन: एक और उदाहरण समस्या को दिखाने के लिए

create sequence seq_test; 

SELECT (SELECT nextval('seq_test')) FROM generate_series(1,5); 

?column? 
---------- 
     1 
     1 
     1 
     1 
     1 
(5 rows) 

उत्तर

4

खैर, random() ही अस्थिर है, इसलिए आप समाप्त करने के लिए बार-बार एक ही चरित्र के साथ तार नहीं मिलता है।

आप के साथ और b*0 बिना प्रश्नों के लिए योजनाओं को देखें, तो आप देखेंगे:

b*0 के साथ:

Function Scan on generate_series a (cost=0.00..37530.00 rows=1000 width=4) 
    SubPlan 1 
    -> Aggregate (cost=37.51..37.52 rows=1 width=32) 
      -> Function Scan on generate_series (cost=0.01..25.01 rows=1000 width=0) 

बिना b*0:

Function Scan on generate_series a (cost=37.52..47.52 rows=1000 width=0) 
    InitPlan 1 (returns $0) 
    -> Aggregate (cost=37.50..37.51 rows=1 width=32) 
      -> Function Scan on generate_series (cost=0.00..25.00 rows=1000 width=0) 

PostgreSQL निर्धारित करता है कि अगर आंतरिक एकत्रीकरण a पर निर्भर नहीं है, फिर इसेके रूप में मूल्यांकन किया जाता है, और अस्थिरता या भीतर अभिव्यक्तियों का नहीं अप्रासंगिक है। a पर सबक्वायरी की निर्भरता को पेश करके, यानी इसे एक सहसंबंधित सबक्वायरी बनाकर, मूल्यांकन a की प्रत्येक पंक्ति के लिए फिर से किया जाना चाहिए।

+0

तो, योजनाकार ने प्रत्येक पंक्ति 'एफ' के लिए आंतरिक अभिव्यक्ति का मूल्यांकन किया, भले ही यह उस पर निर्भर न हो (सही ढंग से क्योंकि यह अस्थिर है), लेकिन बाह्य अभिव्यक्ति का मूल्यांकन तब तक किया जाता है जब तक यह पंक्ति पर निर्भर न हो! किसी भी परिणाम के आधार पर मूल्यों को अस्थिर नहीं करना चाहिए? पंक्ति निर्भरता की तरह ही किया। –

+0

अभिव्यक्ति की अस्थिरता इसे रेखांकित कर देगी, लेकिन यह प्रभावित नहीं करती है कि प्लानर क्वेरी प्लान की व्यवस्था कैसे करता है, जो इस पर आधारित है कि सबसेलेक्ट सहसंबंधित है या नहीं। – araqnid

+0

आपका मतलब है कि किसी भी सबक्वायरी को स्थिर माना जाता है जब तक कि यह बाहरी क्वेरी के पंक्ति चर पर निर्भर न हो! यह मेरे लिए एक बग की तरह दिखता है। मैं अस्थिर अभिव्यक्तियों की अपेक्षा करता हूं कि किसी भी अभिव्यक्ति या सबक्वायरी पर अस्थिरता वायरल प्रभाव हो। InitPlan एक अनुकूलन है, इसे परिणाम नहीं बदलना चाहिए। –

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