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

क्या साइड इफेक्ट के साथ कार्यों को लागू करते समय संघ निष्पादन के आदेश की गारंटी देता है?

व्यवहार में उन्हें दिए गए क्रम में निष्पादित किया जाएगा, लेकिन इसकी कोई गारंटी नहीं है।

यदि इसकी गारंटी है, तो इसे दस्तावेज़ीकरण या SQL मानक में शामिल किया जाएगा। मुझे UNION . के निष्पादन के आदेश का कोई उल्लेख नहीं दिख रहा है दोनों में से।

यदि ऑप्टिमाइज़र के पास एक को दूसरे से पहले निष्पादित करने का कोई कारण होता तो वह ऐसा करने के लिए स्वतंत्र होता।

निष्पादन का क्रम सुनिश्चित करने के लिए, वांछित क्रम में कथन चलाएँ:

SELECT * FROM func1();
SELECT * FROM func2();

यदि आप राउंड ट्रिप को कम करना चाहते हैं, तो संभव हो तो अपने क्लाइंट की बैचिंग सुविधाओं का उपयोग करें, या DO का उपयोग करें ब्लॉक करें:

DO
$$
BEGIN
  PERFORM proc1();
  PERFORM proc2();
END;
$$;

यदि आपको मान वापस करने की आवश्यकता है, तो फ़ंक्शन का उपयोग करें और RETURN QUERY या RETURN NEXT

या आप एक सीटीई के साथ आदेश देने के लिए बाध्य कर सकते हैं, क्योंकि पोस्टग्रेएसक्यूएल (दुर्भाग्य से) सीटीई में अनुकूलन बाड़ के रूप में कार्य करते हैं जो परिणामों को मूर्त रूप देने के लिए बाध्य करते हैं . हालांकि, AFAIK PostgreSQL को अभी भी CTE शर्तों को उनके लिखे जाने के क्रम में, या उनके द्वारा संदर्भित क्रम में निष्पादित करने की आवश्यकता नहीं है; यदि आप ऐसा करते हैं तो आपको केवल गारंटी मिलती है:

WITH f1 AS (SELECT * FROM function1())
SELECT * FROM function2()
UNION ALL
SELECT * FROM f1;

फिर function1 पहले क्रियान्वित और अमल में लाया जाना चाहिए। हालांकि यह एक पोस्टग्रेएसक्यूएल-विशिष्ट मिसफीचर है; यह अन्य डेटाबेस इंजनों के लिए सही नहीं है, मानक द्वारा गारंटी नहीं है, और आपको इस पर भरोसा नहीं करना चाहिए।

इसका विस्तार

. तक नहीं है
WITH f1 AS (SELECT * FROM function1())
     f2 AS (SELECT * FROM function2())
SELECT * FROM f2
UNION ALL
SELECT * FROM f1;

... जैसा कि इस मामले में PostgreSQL स्वतंत्र CTE शर्तों को किसी भी क्रम में निष्पादित कर सकता है।

फिर से, जुड़ने के साथ, वही सिद्धांत लागू होता है। यदि शर्तें स्वतंत्र हैं तो सिस्टम उन्हें किसी भी क्रम में चलाने का विकल्प चुन सकता है, हालांकि यह आमतौर पर नहीं होगा। तो:

select null::void from (select 1 from foo() ) left join (select 1 from bar()) on true

bar() . का मूल्यांकन और कार्यान्वयन कर सकता है फिर इसके परिणामों में शामिल हों foo()

यदि आप आदेशित निष्पादन चाहते हैं, तो आपको यूनियन और जॉइन जैसे सेट संचालन पर निर्भर नहीं होना चाहिए। अलग क्वेरी या प्रक्रियात्मक कोड का उपयोग करें।

हाँ, वहाँ है।

SELECT * FROM function1();
SELECT * FROM function2();



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं कैसे (या मैं कर सकता हूँ) एकाधिक स्तंभों पर DISTINCT का चयन करें?

  2. PostgreSQL 9.0 . पर Pgbouncer के साथ कनेक्शन पूलिंग

  3. रेल और पोस्टग्रेएसक्यूएल का उपयोग करके घटनाओं के साथ समूहीकृत सूची लौटाएं

  4. पोस्टग्रेज/JSON - सभी सरणी तत्वों को अपडेट करें

  5. C++ के माध्यम से PostgreSQL तक पहुंचें - इंटरफ़ेस (लिंकर त्रुटि)