ब्रूस 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)
तो, योजनाकार ने प्रत्येक पंक्ति 'एफ' के लिए आंतरिक अभिव्यक्ति का मूल्यांकन किया, भले ही यह उस पर निर्भर न हो (सही ढंग से क्योंकि यह अस्थिर है), लेकिन बाह्य अभिव्यक्ति का मूल्यांकन तब तक किया जाता है जब तक यह पंक्ति पर निर्भर न हो! किसी भी परिणाम के आधार पर मूल्यों को अस्थिर नहीं करना चाहिए? पंक्ति निर्भरता की तरह ही किया। –
अभिव्यक्ति की अस्थिरता इसे रेखांकित कर देगी, लेकिन यह प्रभावित नहीं करती है कि प्लानर क्वेरी प्लान की व्यवस्था कैसे करता है, जो इस पर आधारित है कि सबसेलेक्ट सहसंबंधित है या नहीं। – araqnid
आपका मतलब है कि किसी भी सबक्वायरी को स्थिर माना जाता है जब तक कि यह बाहरी क्वेरी के पंक्ति चर पर निर्भर न हो! यह मेरे लिए एक बग की तरह दिखता है। मैं अस्थिर अभिव्यक्तियों की अपेक्षा करता हूं कि किसी भी अभिव्यक्ति या सबक्वायरी पर अस्थिरता वायरल प्रभाव हो। InitPlan एक अनुकूलन है, इसे परिणाम नहीं बदलना चाहिए। –