10

के लिए संग्रहित प्रक्रिया यह प्रदर्शन के लिए एक लेन-देन संबंधी डेटाबेस में डेटा denormalizing की बात आती है, देखते हैं (कम से कम) तीन अलग अलग दृष्टिकोण: संग्रहित प्रक्रियाओं के माध्यम सेपेशेवरों और ट्रिगर की विपक्ष बनाम असमान्यीकरण

  1. पुश अद्यतन जो सामान्यीकृत लेनदेन डेटा और denormalized रिपोर्टिंग/विश्लेषण डेटा दोनों अद्यतन करें;

  2. द्वितीयक तालिकाओं को अद्यतन करने वाले लेनदेन तालिकाओं पर ट्रिगर्स लागू करें; यह इतिहास हमेशा बनाए रखने के दौरान हमेशा लिया गया मार्ग है;

  3. एक रात की बैच प्रक्रिया में प्रसंस्करण को देखें, संभवतः एक डेटा मार्ट/वेयरहाउस में ईटीएल कर रहा है।

की, इस सवाल के प्रयोजनों कि # 3 विकल्प व्यवहार्य नहीं है के लिए मान लेते हैं क्योंकि डोमेन हर समय सामान्यीकृत डेटा के साथ संगत होनी denormalized डेटा की आवश्यकता है करते हैं। पदानुक्रमित योग, जो मैं अक्सर के साथ सौदा करता हूं, इसका एक उदाहरण है।

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

तो आपके अनुभव में, रीयल-टाइम denormalized डेटा को बनाए रखने के विशिष्ट उद्देश्य के लिए किसी भी उपकरण के पेशेवरों और विपक्ष क्या हैं? आप किस परिस्थिति में एक दूसरे को चुनते हैं, और क्यों?

(पी एस कृपया की तरह "चलाता भी जटिल हैं" या "सभी अद्यतन हमेशा एक संग्रहीत proc के माध्यम से जाना चाहिए" कोई जवाब - यह सवाल के संदर्भ के लिए उपयुक्त हैं।)

+0

denormalizations के लिए भौतिक दृश्य का उपयोग करने के लिए बेहतर नहीं है? – Enrique

+0

@ एरिकिक: भौतिक दृश्य एक जादुई पैनसिया नहीं हैं; ऐसे सभी प्रकार के विचार हैं जिन्हें आप वास्तव में भौतिक रूप से (या स्कीमा बाध्यकारी के साथ भी बना सकते हैं) और यहां तक ​​कि यदि आप कर सकते हैं, तो वे लगभग समान प्रदर्शन विशेषताओं को ट्रिगर्स के रूप में प्राप्त करेंगे। – Aaronaught

उत्तर

8

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

हम संग्रहीत procs का उपयोग करें और के बारे में 4 रास्तों है कम से कम (जोड़े, अपडेट, निष्क्रिय, कॉपी) पर

यह डेटा हम सिर्फ डाला है/कोई बात नहीं एक ट्रिगर में अद्यतन के साथ काम करना आसान है क्या कार्रवाई हम करें या हम कितनी पंक्तियों को प्रभावित करते हैं।

एक संग्रहीत proc एक भी अद्यतन पथ के लिए काम करता है केवल मुझे लगता है: जब तक आप कोड दोहराना चाहते हैं ...

अब, कोशिश/चलाता में पकड़ने का मतलब है सही, उम्मीद के मुताबिक त्रुटि हैंडलिंग: SQL सर्वर पर चलाता है 2000 और पहले त्रुटि/रोलबैक पर बैच aborts का कारण बनता है जो आदर्श नहीं है (कम से कम कहने के लिए!)। तो, ट्रिगर्स अब भी अधिक विश्वसनीय हैं।

+0

मैं उत्सुक हूं - ट्रिगर में कोई त्रुटि होने पर आप निरस्त क्यों नहीं करना चाहेंगे? क्या ऐसे मामले हैं जहां ट्रिगर के काम को अधूरा (या आधा तैयार) छोड़ना ठीक है? – Aaronaught

+3

केवल तभी यदि आप अपने सिस्टम/डेटा को असंगत स्थिति में छोड़ना चाहते हैं। यहां पृष्ठभूमि लेखों में कुछ जानकारी: http://www.sommarskog.se/error_handling_2005.html –

4

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

+1

मैं बहस कर रहा था कि संग्रहित प्रक्रियाओं और ट्रिगर्स का उपयोग करना है या नहीं। मैं संग्रहित प्रक्रियाओं के खिलाफ जल्दी से निर्णय ले सकता था, लेकिन ट्रिगर्स के साथ परेशानी हो रही थी। आपने इसे मेरे लिए हल किया: कारण यह है कि वे वर्कफ़्लो जटिल करते हैं मेरे लिए पर्याप्त है। :-) – dotslash

0

यह आपकी व्यावसायिक आवश्यकताओं और आपके डेटाबेस का उपयोग कैसे किया जाता है, इस पर निर्भर करता है। उदाहरण के लिए, मान लीजिए कि कई एप्लिकेशन और कई आयात हैं जो तालिका को प्रभावित करते हैं (हमारे पास सैकड़ों चीजें हैं जो हमारी टेबल को प्रभावित कर सकती हैं)। मान लीजिए कि कभी-कभी एसएसएमएस (हाँ भी प्रोड पर) से चलने वाले प्रश्नों को लिखने की आवश्यकता होती है ताकि सभी कीमतों को 10% तक अपडेट किया जा सके। यदि आप इन प्रकार की चीजें करते हैं तो एक संग्रहित प्रो अव्यवहारिक है, आपके पास कवर किए गए डेटाबेस को प्रभावित करने के हर संभव तरीके से कभी भी नहीं होगा।

यदि यह डेटा परिवर्तन डेटा अखंडता या कई अनुप्रयोगों या प्रक्रियाओं (आयात, SQL सर्वर नौकरियां इत्यादि) के लिए आवश्यक है डेटा को प्रभावित कर सकता है, तो यह ट्रिगर में संबंधित है।

यदि डेटा परिवर्तन की आवश्यकता केवल कभी-कभी होती है या आपके पास केवल एक ही एप्लिकेशन से डेटा कैसे बदला जाता है, तो कुल नियंत्रण होता है, तो एक संग्रहित प्रो ठीक है।

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