जैसा कि आप देख सकते हैं, "क्यों" प्रश्न के लिए ऐतिहासिक तर्क और भाषा के लिए अंतर्निहित मान्यताओं सहित एक अलग तरह के उत्तर की आवश्यकता है, मुझे यकीन नहीं है कि मैं वास्तव में उस न्याय को कर सकता हूं।
SQL MVP Erland Sommarskog का यह व्यापक लेख मैकेनिक के साथ कुछ तर्क प्रदान करने का प्रयास करता है:
गतिशील एसक्यूएल का अभिशाप और आशीर्वाद :
कैशिंग क्वेरी योजनाएं
SQL सर्वर में आपके द्वारा चलाए जाने वाले प्रत्येक क्वेरी के लिए क्वेरी योजना की आवश्यकता होती है। जब आप पहली बार क्वेरी चलाते हैं, तो SQL सर्वर इसके लिए एक क्वेरी प्लान बनाता है - या जैसे ही शब्दावली जाती है - यह क्वेरी को संकलित करता है। SQL सर्वर योजना को कैश में सहेजता है, और अगली बार जब आप क्वेरी चलाते हैं, तो योजना का पुन: उपयोग किया जाता है।
यह (और सुरक्षा, नीचे देखें) शायद सबसे बड़ा कारण है।
SQL इस आधार पर संचालित होता है कि क्वेरी एक बार के संचालन नहीं हैं, लेकिन यह कि उनका उपयोग बार-बार किया जाएगा। यदि तालिका (या डेटाबेस!) वास्तव में क्वेरी में निर्दिष्ट नहीं है, तो भविष्य के उपयोग के लिए निष्पादन योजना बनाने और बचाने का कोई तरीका नहीं है।
हां, हमारे द्वारा चलाए जाने वाले प्रत्येक क्वेरी का पुनः उपयोग नहीं किया जाएगा, लेकिन यह SQL का डिफ़ॉल्ट ऑपरेटिंग आधार है , इसलिए "अपवाद" असाधारण होने के लिए हैं।
एर्लैंड सूचियों के कुछ अन्य कारण (ध्यान दें कि वह संग्रहीत प्रक्रियाओं का उपयोग करने के लाभों को स्पष्ट रूप से सूचीबद्ध कर रहा है , लेकिन इनमें से कई पैरामीटरयुक्त (गैर-गतिशील) प्रश्नों के भी लाभ हैं):
- अनुमति प्रणाली : SQL इंजन यह अनुमान नहीं लगा सकता है कि आपके पास क्वेरी चलाने का अधिकार है या नहीं, यदि वह उस तालिका (या डेटाबेस) को नहीं जानता है जिसके खिलाफ आप काम कर रहे होंगे। गतिशील एसक्यूएल का उपयोग करते हुए "अनुमति श्रृंखला" बट में दर्द होता है।
- नेटवर्क ट्रैफ़िक को कम करना : स्टोर किए गए प्रॉप का नाम और नेटवर्क पर कुछ पैरामीटर मान पास करना एक लंबे क्वेरी स्टेटमेंट से कम है।
- एनकैप्सुलेटिंग लॉजिक : आपको अन्य प्रोग्रामिंग वातावरणों से तर्क-वितर्क के फायदों से परिचित होना चाहिए।
- क्या उपयोग किया जाता है, इस पर नज़र रखना : अगर मुझे कॉलम की परिभाषा बदलने की आवश्यकता है, तो मुझे उस सभी कोड को कैसे पता चल सकता है जो इसे कॉल करता है? सिस्टम प्रक्रियाएँ SQL डेटाबेस में निर्भरताएँ खोजने के लिए मौजूद होती हैं, लेकिन केवल तभी जब कोड संग्रहीत प्रक्रियाओं में हो।
- एसक्यूएल कोड लिखने में आसानी : सिंटैक्स चेक तब होता है जब आप एक संग्रहीत प्रक्रिया बनाते हैं या संशोधित करते हैं, इसलिए उम्मीद है कि कम त्रुटियों का परिणाम होगा।
- कीड़े और समस्याओं को संबोधित करना : एक डीबीए कभी-कभी गतिशील एसक्यूएल की तुलना में व्यक्तिगत संग्रहीत प्रक्रियाओं के प्रदर्शन को बहुत आसानी से ट्रेस और माप सकता है।
फिर, इनमें से प्रत्येक की सौ बारीकियाँ हैं जो मुझे यहाँ नहीं मिलेंगी।