स्केलिंग पोस्टग्रेक्ज़ी ट्राइगर (ओं)


14

कैसे हो जाता है ट्रिगर तंत्र तराजू?

हमारे पास एक बड़ी PostgreSQL स्थापना है और हम लॉग टेबल और TRIGGER (s) का उपयोग करके एक इवेंट आधारित प्रणाली को लागू करने की कोशिश कर रहे हैं।

मूल रूप से हम प्रत्येक तालिका के लिए एक ट्राइगर बनाना चाहेंगे जिसे हम एक अद्यतन / इन्सर्ट / DELETE संचालन के लिए अधिसूचित करना चाहते हैं। एक बार जब यह ट्रिगर आग लगाता है तो यह एक फ़ंक्शन को निष्पादित करेगा जो बस एक नई पंक्ति (ईवेंट को एन्कोडिंग) करेगा एक लॉग टेबल पर जिसे हम फिर एक बाहरी सेवा से पोल करेंगे।

Postgres TRIGGER (ओं) के साथ सभी में जाने से पहले हम यह जानना चाहेंगे कि वे किस पैमाने पर हैं: हम एक ही Postgres स्थापना पर कितने ट्रिगर बना सकते हैं? क्या वे क्वेरी प्रदर्शन को प्रभावित करते हैं? क्या इससे पहले किसी ने कोशिश की थी?


आप PgQ को उपयोगी पा सकते हैं , यह डेटा संशोधन घटनाओं को पंजीकृत करने के लिए C ट्रिगर का उपयोग करता है।
dezso

सुनो पर ध्यान दें / सूचित करें कि आपको ट्रिगर की आवश्यकता नहीं हो सकती है: postgresql.org/docs/current/static/sql-listen.html
a_horse_with_no_name

जवाबों:


17

मूल रूप से हम प्रत्येक तालिका के लिए एक ट्राइगर बनाना चाहेंगे जिसे हम एक अद्यतन / इन्सर्ट / DELETE संचालन के लिए अधिसूचित करना चाहते हैं। एक बार जब यह ट्रिगर आग लगाता है तो यह एक फ़ंक्शन को निष्पादित करेगा जो बस एक नई पंक्ति (ईवेंट को एन्कोडिंग) करेगा एक लॉग टेबल पर जिसे हम फिर एक बाहरी सेवा से पोल करेंगे।

यह एक ट्रिगर के लिए एक सुंदर मानक उपयोग है।

Postgres TRIGGER (ओं) के साथ सभी में जाने से पहले हम यह जानना चाहेंगे कि वे किस पैमाने पर हैं: हम एक ही Postgres स्थापना पर कितने ट्रिगर बना सकते हैं?

यदि आप उन्हें बनाते रहते हैं, तो अंततः आप डिस्क स्थान से बाहर निकल जाएंगे।

ट्रिगर्स के लिए कोई विशिष्ट सीमा नहीं है।

PostgreSQL सीमाएँ पृष्ठ के बारे में प्रलेखित हैं ।

क्या वे क्वेरी प्रदर्शन को प्रभावित करते हैं?

यह ट्रिगर प्रकार, ट्रिगर भाषा और ट्रिगर क्या करता है पर निर्भर करता है।

एक साधारण PL / PgSQL BEFORE ... FOR EACH STATEMENTट्रिगर जो कुछ भी नहीं करता है उसके पास शून्य-शून्य ओवरहेड है।

FOR EACH ROWट्रिगर्स में ट्रिगर्स की तुलना में अधिक ओवरहेड होता FOR EACH STATEMENTहै। स्केलिंग, स्पष्ट रूप से, प्रभावित पंक्ति मायने रखती है।

AFTERट्रिगर्स ट्रिगर्स की तुलना में अधिक महंगे हैं BEFOREक्योंकि उन्हें तब तक कतारबद्ध होना चाहिए जब तक कि स्टेटमेंट अपने काम को पूरा नहीं करता है, तब निष्पादित किया जाता है। यदि डिस्क बड़ी हो जाती है तो वे डिस्क पर नहीं जाते हैं (कम से कम 9.4 और नीचे, भविष्य में बदल सकते हैं) इसलिए बहुत बड़ी AFTERट्रिगर कतार स्मृति को ओवररन करने का कारण बन सकती है, जिसके परिणामस्वरूप बयान निरस्त हो सकता है।

एक ट्रिगर जो NEWडालने / अद्यतन करने से पहले पंक्ति को संशोधित करता है वह एक ट्रिगर की तुलना में सस्ता है जो डीएमएल करता है।

विशिष्ट उपयोग का मामला जो आप चाहते हैं वह इन-प्रोग्रेस एन्हांसमेंट के साथ बेहतर प्रदर्शन करेगा जो इसे PostgreSQL 9.5 (यदि हम भाग्यशाली हैं) में बना FOR EACH STATEMENTसकते हैं , जहां ट्रिगर वर्चुअल OLDऔर NEWटेबल देख सकते हैं । वर्तमान PostgreSQL संस्करणों में यह संभव नहीं है, इसलिए आपको FOR EACH ROWइसके बजाय ट्रिगर्स का उपयोग करना होगा ।

क्या इससे पहले किसी ने कोशिश की थी?

बेशक। यह ट्रिगर्स के लिए एक बहुत मानक उपयोग है, साथ ही ऑडिटिंग, पवित्रता जाँच आदि।

टास्क टेबल में बदलाव होने पर आप अपने कार्यकर्ता को जगाने के लिए LISTENऔर NOTIFYअच्छे तरीके से देखना चाहेंगे ।

आप पहले से ही ट्रिगर्स से सीधे बाहरी सिस्टम पर बात करने से बचकर सबसे महत्वपूर्ण काम कर रहे हैं। यह प्रदर्शन और विश्वसनीयता के लिए समस्याग्रस्त है। लोग अक्सर एक ट्रिगर से सीधे मेल भेजने जैसे काम करने की कोशिश करते हैं, और यह बुरी खबर है।


1

यह थोड़ा बेलेंटेड उत्तर है, लेकिन भविष्य के पाठकों के लिए उपयोगी हो सकता है

अब दिन (10,11,12 संस्करणों में) हमें एक ही डेटा को दो बार (पीजी और मैन्युअल रूप से वाल द्वारा) स्टोर करने की आवश्यकता नहीं है। हम अपने डेटा को सभी या कुछ परिवर्तनों को ट्रैक करने के लिए Postgre Logical Decoding यांत्रिकी (समान तार्किक प्रतिकृति के रूप में) का उपयोग कर सकते हैं (या बाद में विश्लेषण करने के लिए उन घटनाओं को कफ़े की तरह कुछ कतार में भेज सकते हैं)

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