क्या पुन: प्रयोज्य के लिए स्टेटमेंट द्वारा विभाजित की जाने वाली क्वेरी योजनाओं के लिए बेहतर होगा?


11

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

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

मेरा प्रश्न यह है: यदि कोई उपयोगकर्ता किसी ऐसे कथन को निष्पादित करता है जो बहु-कथन क्वेरी में दिए गए कथनों में से एक है, तो क्या वह बहु-कथन क्वेरी के लिए कैश में पहले से ही क्वेरी प्लान के उस प्रासंगिक हिस्से का उपयोग कर सकता है? मुझे उम्मीद है कि उत्तर नहीं है क्योंकि हैश मूल्य स्पष्ट रूप से मेल नहीं खाएंगे, लेकिन बहु-स्टेटमेंट क्वेरी में प्रत्येक स्टेटमेंट को हैश करना बेहतर होगा ताकि वे उपयोगकर्ताओं को क्वेरी से अलग-अलग स्टेटमेंट चला रहे हों?

मुझे उम्मीद है कि ऐसी जटिलताएँ हैं जो मैं ध्यान में नहीं रख रहा हूँ (और यह इन है कि मैं वास्तव में इसके बारे में जानना चाहता हूं), लेकिन ऐसा लगता है कि हम कई क्वेरी योजनाओं में एक ही 'स्टेटमेंट प्लान' जमा कर सकते हैं और अधिक स्थान ले रहे हैं और अधिक ले रहे हैं सीपीयू और उत्पन्न करने का समय।

हालांकि मेरी अज्ञानता दिखा सकता है।


dbidऔर objectidदोनों के पास is_cache_key=1इतना है कि आपको विभिन्न संकलित वस्तुओं के बीच योजनाओं का कोई भी पुन: उपयोग नहीं मिलेगा।
मार्टिन स्मिथ

जवाबों:


11

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

नहीं। SQL सर्वर में पुन: उपयोग की मूल इकाई बैच है

क्या बहु-कथन क्वेरी में प्रत्येक कथन को हैश करना बेहतर होगा ताकि वे उपयोगकर्ताओं को क्वेरी से अलग-अलग स्टेटमेंट चला रहे हों?

योजना के पुन: उपयोग के उच्च स्तरों के लिए तैयार की गई प्रणाली SQL सर्वर पर पुन: प्रयोज्य वस्तुओं (जैसे प्रक्रिया, कार्य, ट्रिगर) में सामान्य कोड (एक उपयुक्त ग्रैन्युलैरिटी पर) रखेगी। यह स्पष्ट रूप से किसी भी एप्लिकेशन-जनरेट किए गए या क्लाइंट-साइड कोड को भी स्पष्ट करेगा। अधिकतम योजना के पुन: उपयोग के लिए, इन उत्पन्न बैचों को केवल पैरामीटर मानों में भिन्न होना चाहिए।

मुझे उम्मीद है कि ऐसी जटिलताएँ हैं, जिन्हें मैं ध्यान में नहीं रख रहा हूँ

ऐसा लगता है कि आप पूछ रहे हैं कि SQL सर्वर को कैश और पुन: उपयोग करने के लिए डिज़ाइन क्यों किया गया था, बजाय बयान स्तर पर। मुझे संदेह है कि मूल डिजाइनरों से अलग कोई भी व्यक्ति इस प्रश्न का उत्तर आधिकारिक रूप से दे सकता है। वैसे भी, यह मुझे लगता है कि एक बैच का उपयोग करने के लिए एक प्राकृतिक ग्रैन्युलैरिटी है क्योंकि यह काम की अपेक्षाकृत आत्म-निहित प्राकृतिक इकाई है, और कार्यान्वयन जटिलता और योजना के पुन: उपयोग की संभावना के बीच एक उचित व्यापार बंद का प्रतिनिधित्व करता है।

ऐसी कुछ चीजें हैं जो बैचों को पूरी तरह से आत्म-निहित नहीं बनाती हैं (उदाहरण के लिए स्थानीय अस्थायी टेबल बनाई गई और संग्रहीत प्रक्रिया सीमाओं के संदर्भ में)। ये अपवाद रूढ़िवादिता को कम करते हैं और वर्षों से 'डिजाइन' व्यवहार और बग से अप्रत्याशित रूप से जुड़े हुए हैं।

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