PostgreSQL: अपरिवर्तनीय, अस्थिर, स्थिर


11

मैं IMMUTABLE, VOLATILE और STABLE फ़ंक्शन की परिभाषाओं में सही अर्थ के बारे में स्पष्ट नहीं हूं।

मैं प्रलेखन पढ़ता हूं, विशेष रूप से प्रत्येक की परिभाषाएं।

IMMUTABLE इंगित करता है कि फ़ंक्शन डेटाबेस को संशोधित नहीं कर सकता है और समान तर्क मान दिए जाने पर हमेशा वही परिणाम देता है ; अर्थात्, यह डेटाबेस लुकअप नहीं करता है या अन्यथा इसकी तर्क सूची में सीधे मौजूद जानकारी का उपयोग नहीं करता है। यदि यह विकल्प दिया जाता है, तो सभी-निरंतर तर्कों वाले फ़ंक्शन के किसी भी कॉल को तुरंत फ़ंक्शन मान के साथ बदल दिया जा सकता है।

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

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

मेरा भ्रम IMMUTABLE और STABLE के लिए इस स्थिति के साथ आता है कि फ़ंक्शन ALWAYS या CONSISTENTLY उसी परिणाम देता है जो समान तर्क देता है।

IMMUTABLE परिभाषा बताती है कि फ़ंक्शन डेटाबेस लुकअप नहीं करता है या अन्यथा इसकी तर्क सूची में मौजूद जानकारी का सीधे उपयोग नहीं करता है। तो, मेरे लिए, इसका मतलब है कि इस तरह के कार्यों का उपयोग क्लाइंट द्वारा प्रदान किए गए डेटा में हेरफेर करने के लिए किया जाता है, और इसमें सेलेक्ट स्टेटमेंट नहीं होना चाहिए ... हालांकि यह मेरे लिए थोड़ा अजीब लगता है।

STABLE के साथ, परिभाषा समान है कि यह कहता है कि इसे लगातार उसी परिणाम को वापस करना चाहिए। तो, मेरे लिए, इसका मतलब है कि हर बार फ़ंक्शन को एक ही तर्कों के साथ कहा जाता है, इसे उसी परिणाम (समान सटीक पंक्तियों, हर एक समय) को वापस करना चाहिए।

तो, मेरे लिए ... इसका मतलब है कि कोई भी फ़ंक्शन जो किसी तालिका या तालिकाओं पर एक चयन करता है जिसे अपडेट किया जा सकता है, केवल अस्थिर होना चाहिए।

लेकिन, फिर से ... यह मेरे लिए सही नहीं लगता।

अपने उपयोग-मामले में इसे वापस लाते हुए, मैं ऐसे फ़ंक्शन लिख रहा हूं, जो कई JOIN के साथ चयन कथन निष्पादित करते हैं, जिन्हें लगातार जोड़ा जा रहा है, इसलिए फ़ंक्शन कॉल से अलग-अलग परिणामों की वापसी की उम्मीद की जाएगी जब भी यह कहा जाता है, तब भी। ।

तो, क्या इसका मतलब यह है कि मेरे कार्य VOLATILE होने चाहिए? भले ही दस्तावेज़ीकरण अपेक्षाकृत कुछ डेटाबेस कार्यों को इंगित करता है इस अर्थ में अस्थिर हैं ?

धन्यवाद!

जवाबों:


15

IMMUTABLEएक शुद्ध कार्य होना चाहिए, जिसके परिणाम केवल उसके इनपुट पर निर्भर करते हैं। यह एक बहुत ही सख्त आवश्यकता है; वे अन्य गैर-अपरिहार्य कार्यों को नहीं कह सकते हैं, वे तालिकाओं तक नहीं पहुंच सकते हैं, वे कॉन्फ़िगरेशन गुणों के मूल्य तक नहीं पहुंच सकते हैं, आदि।

STABLEकिसी भी इनपुट का उपयोग कर सकते हैं जो स्वयं हैं STABLE: अन्य STABLEया IMMUTABLEफ़ंक्शंस, और SELECTतालिकाओं के प्रश्न। यह क्वेरी टेबल के लिए सुरक्षित है क्योंकि क्वेरी के वर्तमान स्नैपशॉट के भीतर उन तालिकाओं के फ़ंक्शन का दृश्य नहीं बदलेगा। आप GUC मानों ( current_setting(...)) का उपयोग कर सकते हैं, जब तक आप जानते हैं कि वे वर्तमान विवरण के भीतर असाइन नहीं किए जाएंगे।

VOLATILE कार्य वह सब कुछ हैं जो ऊपर फिट नहीं होते हैं:

  • साइड-इफेक्ट्स के साथ कुछ भी
  • जो कुछ भी लिखता है
  • कुछ भी जो बाहरी डेटा को प्रबंधित करता है, वह पोस्टग्रेक्यूएल स्नैपशॉट द्वारा प्रबंधित नहीं होता है
  • ...

सामान्य तौर पर, VOLATILEजब तक आपके पास एक अच्छा कारण नहीं है , तब तक सब कुछ छोड़ दें ।

उपयोग करने का मुख्य कारण यह IMMUTABLEहै कि फ़ंक्शन लिखते समय जो इंडेक्स एक्सप्रेशन के हिस्से के रूप में उपयोग किए जाने हैं।


1
"वे तालिकाओं का उपयोग नहीं कर सकते।" निष्पक्षता में, वे कर सकते हैं और वे करते हैं। मुझे लगता है कि एक अधिक सामान्य नियम यह है कि तालिकाओं को डेटाबेस-पुनरारंभ के बिना सार्थक रूप से म्यूट करने के लिए नहीं माना जाता है।
इवान कैरोल

यदि STABLE टेबल एक्सेस की अनुमति देता है, तो क्या VOLATILE के ऊपर / ऊपर कोई अनुकूलन है ...?
ब्रूक्स

मेरे सिर के ऊपर से याद न रखें, डॉक्स / कोड की जांच करनी होगी।
क्रेग रिंगर

4

स्थिर के लिए, आपको जिस भाग को बोल्ड करने की आवश्यकता है वह है 'परिणाम पूरे SQL कथनों में बदल सकता है'

IMMUTABLE चीजें कभी भी बदलने वाली नहीं हैं। यहां तक कि अगर आप को पुनः आरंभ अपने डेटाबेस सर्वर, रन yum update(लेकिन निश्चित रूप से वहाँ कीड़े हो सकता है!), आपके विन्यास (जैसे बदल datestyle, timezone, default_text_search_config, extra_float_digits, आदि), या अपने सर्वर हार्डवेयर पूरी तरह से (पुराने हार्डवेयर के रूप में ही वास्तुकला का स्थान ले, तो बाइनरी फाइलें अभी भी संगत हैं)।

फ़ंक्शंस जो आप ध्वनि का वर्णन करते हैं जैसे वे स्थिर हैं, क्योंकि एक एकल एसक्यूएल बयान के भीतर वे उसी क्वेरी का उपयोग करके अपने प्रश्नों को निष्पादित करेंगे जैसे बाहरी क्वेरी में है, और इसलिए उन अन्य तालिकाओं में किए गए कोई भी समवर्ती परिवर्तन दिखाई नहीं देंगे। अब, यदि आपके कार्य सर्वर से एक नया कनेक्शन खोलते हैं और उस स्वतंत्र कनेक्शन के भीतर अपने प्रश्नों को चलाते हैं, तो यह फ़ंक्शन को अस्थिर कर देगा, क्योंकि वे अलग-अलग स्नैपशॉट का उपयोग करेंगे।


मेरा मानना ​​है कि मैं IMMUTABLE के लिए पूर्व-आवश्यकताएँ समझता हूं (कुछ भी नहीं बदल सकता है .... कभी भी, प्रश्न, कनेक्शन, रिबूट, ग्रह विनाश और पुनर्निर्माण के बीच, EVEN IF डेटाबेस संशोधित किया गया है) और VOLATILE (फ़ंक्शन संदर्भ के बाहर कूदता है जिसे यह कहा जाता था)। क्या वो सही है? तो, तब यह दिखाई देता है कि बस फ़ंक्शन का अर्थ है कि फ़ंक्शन डेटाबेस को संशोधित नहीं करता है और डेटाबेस को इसके संदर्भ से बाहर नहीं पहुंचाता है? STABLE की परिभाषा ऐसा लगता है जैसे यह वास्तव में होने की तुलना में अधिक जटिल है ... या क्या मैं कुछ बाहर छोड़ रहा हूं?
ब्रूक्स

PostgreSQL वास्तव में कुछ मुद्दों के आसपास IMMUTABLEऔर टकराव है। यह विश्वास करता है कि glibc(या, नए Pg, iconv में) कोलाज परिभाषाओं को नहीं बदलेगा। वास्तव में, वे इस तरह के बदलावों का पता लगाने के लिए कोई उपाय नहीं करते हैं और न ही कोई रास्ता प्रदान करते हैं। यह मूक सूचकांक भ्रष्टाचार :( को जन्म दे सकता यह ज्यादातर एक मुद्दा जब आदि विभिन्न ओएस संस्करणों के बीच नकल, है।
क्रेग रिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.