2008-09-12 13 views
92

पारंपरिक ज्ञान बताता है कि संग्रहित प्रक्रियाएं हमेशा तेज होती हैं। इसलिए, चूंकि वे हमेशा तेज़ होते हैं, उन्हें सभी समय का उपयोग करें।आधुनिक आरडीबीएमएस के इनलाइन स्टेटमेंट की तुलना में संग्रहीत प्रक्रियाएं सामान्य रूप से अधिक कुशल हैं?

मुझे पूरा यकीन है कि यह कुछ ऐतिहासिक संदर्भ में आधारित है जहां यह एक बार मामला था। अब, मैं वकालत नहीं कर रहा हूं कि संग्रहीत प्रक्रियाओं की आवश्यकता नहीं है, लेकिन मैं जानना चाहता हूं कि आधुनिक डेटाबेस जैसे MySQL, SqlServer, Oracle, या में संग्रहित प्रोसेस आवश्यक हैं। क्या यह संग्रहीत प्रोसेस के माध्यम से सभी पहुंच है?

उत्तर

240

नोट है कि यह एक विशिष्ट डीबीएमएस को विनियमित नहीं संग्रहित प्रक्रियाओं पर एक सामान्य लग रहे है। कुछ डीबीएमएस (और यहां तक ​​कि, अलग-अलग समान डीबीएमएस के संस्करण!) इसके विपरीत काम कर सकते हैं, इसलिए आप यह सुनिश्चित करने से पहले अपने लक्ष्य डीबीएमएस से दोबारा जांच कर सकते हैं।

मैं लगभग एक दशक (सी, PHP, पीएल/एसक्यूएल, सी # .NET, और रूबी में अनुप्रयोग विकास के साथ) के साथ एक Sybase एएसई, MySQL, और SQL सर्वर डीबीए चालू और बंद किया गया है। इसलिए, मेरे पास इस (कभी-कभी) पवित्र युद्ध में पीसने के लिए कोई विशेष कुल्हाड़ी नहीं है।

  • पूर्व पार्स एसक्यूएल
  • पहले से बनाई गई क्वेरी निष्पादन योजना
  • कम नेटवर्क:

संग्रहीत procs का ऐतिहासिक प्रदर्शन लाभ आम तौर पर निम्नलिखित (किसी विशेष क्रम में) से किया गया है विलंबता

  • संभावित कैश लाभ
  • प्री-पार्सड एसक्यूएल - बहुत ही सूक्ष्म स्तर को छोड़कर संकलित बनाम व्याख्या कोड के समान लाभ।

    अभी भी एक फायदा है? आधुनिक सीपीयू पर बिल्कुल ध्यान देने योग्य नहीं है, लेकिन यदि आप एक एकल एसक्यूएल कथन भेज रहे हैं जो कि बहुत बड़ा ग्यारह-अरब गुना दूसरा है, तो पार्सिंग ओवरहेड जोड़ सकता है।

    पहले से बनाई गई क्वेरी निष्पादन योजना। यदि आपके पास कई जॉइन हैं तो क्रमपरिवर्तन काफी अप्रबंधनीय हो सकता है (आधुनिक अनुकूलकों के प्रदर्शन कारणों से सीमाएं और कट ऑफ हैं)। यह बहुत ही जटिल एसक्यूएल के लिए अज्ञात नहीं है, मापने योग्य (मैंने एक जटिल क्वेरी को डीबीएमएस को ट्वीक करने से पहले एक योजना उत्पन्न करने के लिए 10+ सेकेंड लगते हैं) ऑप्टिमाइज़र के कारण "सर्वोत्तम सर्वोत्तम" " निष्पादन योजना। संग्रहित प्रक्रियाएं आम तौर पर इसे स्मृति में संग्रहीत करती हैं ताकि आप इस ओवरहेड से बच सकें।

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

    इसके अलावा, अधिक से अधिक डीबीएमएस आप अनुकूलक पथ की योजना (सार क्वेरी की योजना) काफी अनुकूलन के समय को कम करने के लिए प्रदान करने की अनुमति (दोनों तदर्थ और संग्रहीत प्रक्रिया SQL के लिए !!)।

    चेतावनी कैश्ड क्वेरी योजनाओं के लिए एक प्रदर्शन रामबाण नहीं हैं। कभी-कभी जेनरेट की गई क्वेरी योजना उप-इष्टतम है। उदाहरण के लिए, यदि आप SELECT * FROM table WHERE id BETWEEN 1 AND 99999999 भेजते हैं, तो डीबीएमएस इंडेक्स स्कैन के बजाय पूर्ण-तालिका स्कैन का चयन कर सकता है क्योंकि आप तालिका में प्रत्येक पंक्ति को पकड़ रहे हैं (इसलिए आंकड़े बताते हैं)। यदि यह कैश किया गया संस्करण है, तो आप बाद में प्रदर्शन प्राप्त कर सकते हैं जब आप बाद में SELECT * FROM table WHERE id BETWEEN 1 AND 2 भेजते हैं। http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx और http://msdn.microsoft.com/en-us/library/ms181055.aspx और http://www.simple-talk.com/sql/performance/execution-plan-basics/

    "संक्षेप में, वे निर्धारित किया है कि समान मूल्यों जब के अलावा और कुछ की आपूर्ति: इस के पीछे तर्क यह पोस्टिंग के दायरे से बाहर , लेकिन आगे पढ़ने के देखने के लिए है एक संकलन या रीकंपाइल का परिणाम ऑप्टिमाइज़र संकलन और कैशिंग उस विशेष मान के लिए क्वेरी प्लान का परिणाम हुआ। फिर भी, जब वह क्वेरी योजना बाद में पुन: उपयोग की गई के सामान्य मान ('एम', 'आर', या 'टी') के लिए समान क्वेरी के निष्पादन, इसके परिणामस्वरूप उप-इष्टतम प्रदर्शन हुआ। यह उप-इष्टतम प्रदर्शन समस्या क्वेरी तब तक मौजूद थी जब तक क्वेरी पुन: संकलित नहीं हुई थी। उस समय, @ P1 पैरामीटर मान आपूर्ति के आधार पर कम, क्वेरी या एक प्रदर्शन समस्या है नहीं हो सकता है हो सकता है। "

    कम नेटवर्क विलंबता ए) आप पर एक ही एसक्यूएल चला रहे हैं और अधिक - और एसक्यूएल कोड के कई केबी तक जोड़ता है - इसे एक सरल "exec foobar" के साथ बदलकर वास्तव में जोड़ सकते हैं। बी) प्रक्रियात्मक कोड को डीबीएमएस में स्थानांतरित करने के लिए संग्रहीत प्रो का उपयोग किया जा सकता है। इससे बड़े पैमाने पर shuffling बचाता है क्लाइंट को केवल डेटा की मात्रा को वापस भेजने के लिए डेटा की मात्रा (या बिल्कुल भी नहीं!)। आपके कोड में डीबीएमएस बनाम में जॉइन करने के लिए एनालॉगस (हर किसी के पसंदीदा डब्ल्यूटीएफ!)

    अभी भी एक फायदा है? ए) आधुनिक 1 जीबी (और 10 जीबी और ऊपर!) ईथरनेट वास्तव में यह नगण्य बनाते हैं। बी) इस बात पर निर्भर करता है कि आपके नेटवर्क को कितना संतृप्त किया गया है - किसी भी अच्छे कारण के लिए डेटा के कई मेगाबाइट्स को आगे क्यों नहीं फेंकते हैं?

    संभावित कैश प्रदर्शन डेटा संभवतः हो सकता है की सर्वर साइड रूपांतरण लाभ तेजी से अगर आप डीबीएमएस पर पर्याप्त स्मृति और डेटा की जरूरत है सर्वर की स्मृति में है।

    अभी भी एक फायदा है? जब तक आपके ऐप ने डीबीएमएस डेटा तक मेमोरी एक्सेस साझा नहीं की है, तो एज हमेशा प्रोसेस को संग्रहीत करेगा।

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

    SELECT .. FROM yourtable WHERE foo = ? AND bar = ? 
    
    : एक मेजबान भाषा क्वेरी मूल्यों के लिए "पैरामीटर" का उपयोग करता है, उदाहरण के लिए में

    Parameterized/तैयार एसक्यूएल
    संग्रहित प्रक्रियाओं और तदर्थ एसक्यूएल के बीच एक क्रॉस की तरह, वे एम्बेडेड रहे हैं SQL कथन

    ये एक प्रश्न का एक अधिक सामान्यीकृत संस्करण प्रदान करते हैं कि आधुनिक-दिन अनुकूलक क्वेरी निष्पादन योजना को कैश (और पुन: उपयोग) करने के लिए उपयोग कर सकते हैं, जिसके परिणामस्वरूप संग्रहित प्रक्रियाओं के प्रदर्शन लाभ का अधिकतर परिणाम होता है।

    विज्ञापन एचक्यूएल बस अपने डीबीएमएस में एक कंसोल विंडो खोलें और एक SQL कथन टाइप करें।अतीत में, ये "सबसे खराब" कलाकार (औसतन) थे क्योंकि डीबीएमएस के पास पैरामीटर/संग्रहीत प्रो विधि में प्रश्नों को पूर्व-अनुकूलित करने का कोई तरीका नहीं था।

    अभी भी एक नुकसान है? जरूरी नहीं है। अधिकांश डीबीएमएस में पैरामीटर संस्करणों में एसक्यूएल को "अमूर्त" करने की क्षमता होती है - इस प्रकार दोनों के बीच अंतर को कम या ज्यादा कम किया जाता है। कुछ इसे निहित रूप से करते हैं या कमांड सेटिंग (SQL सर्वर: http://msdn.microsoft.com/en-us/library/ms175037.aspx, ओरेकल: http://www.praetoriate.com/oracle_tips_cursor_sharing.htm) के साथ सक्षम होना चाहिए।

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

    वैसे भी, मुझे लगता है कि यदि आप किनारे के मामलों से बचते हैं और काफी वेनिला एसक्यूएल है, तो आपको विज्ञापन और संग्रहित प्रक्रियाओं के बीच कोई अंतर नहीं दिखाई देगा।

    +9

    मैट, यह संभवतः अब तक का सबसे अच्छा जवाब है जिसे मैंने एसओ पर पढ़ा है। बहुत बढ़िया! काश मैं आपको एक से अधिक बार रेट कर सकता हूं। – Danimal

    +5

    यह एक महान प्रतिक्रिया है, लेकिन आपको ध्यान रखना चाहिए कि इसे * पैरामीटरकृत * एसक्यूएल - सादा वेनिला "प्रतिस्थापन के साथ एक विशाल स्ट्रिंग का निर्माण" होना चाहिए, एसक्यूएल भी प्रदर्शन नहीं करता है। –

    +1

    @ जेफ एटवुड: अच्छा बिंदु; नग्न –

    0

    मुझे नहीं पता कि वे तेज़ हैं। मुझे डेटा एक्सेस के लिए ओआरएम का उपयोग करना पसंद है (पहिया का पुन: आविष्कार नहीं करना) लेकिन मुझे एहसास है कि यह हमेशा एक व्यवहार्य विकल्प नहीं है। http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

    0

    संग्रहीत procs मामलों में जहां एसक्यूएल कोड अक्सर चलाया जाता है क्योंकि डेटाबेस भंडार यह स्मृति में tokenized के लिए महान हैं:

    Frans बाउमा इस विषय पर एक अच्छा लेख है। यदि आप बार-बार एक संग्रहित प्रो के बाहर एक ही कोड चलाते हैं, तो आप उसी कोड को दोबारा रिकॉर्ड करने वाले डेटाबेस से प्रदर्शन हिट करना पसंद करेंगे।

    मैं आमतौर पर अक्सर संग्रहीत प्रो के रूप में या SQLLommand (.NET) ऑब्जेक्ट के रूप में कोड कहलाता हूं और जितनी बार आवश्यक हो निष्पादित करता हूं।

    1

    उस पर फ़्रांस बोमा के excellent post (अगर थोड़ा पक्षपातपूर्ण) पढ़ें।

    15

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

    +0

    यह आजकल चीजों की स्थिति के बारे में मेरी भावना है, लेकिन यह हमेशा एक तर्क की तरह लगता है कि आप किसी कारण या किसी अन्य कारण से डीबीए के साथ नहीं जा रहे हैं। – casademora

    +0

    क्या डीबीए ने फ़्रांस के लेख को उत्तर के रूप में पोस्ट किया है :) –

    +0

    मैंने इसे बुकमार्क किया है, इसलिए मेरे पास अब मेरी पिछली जेब में है।लेकिन अफसोस की बात है, कुछ चीजें तब से नहीं बदली जा सकती हैं) यह मानक ऑपरेटिंग प्रक्रिया है, और बी) प्रो के मौजूदा सेट में इतनी विरासत है, ठीक है, वे जल्द ही किसी भी समय नहीं जा रहे हैं। – casademora

    1

    मैं बस SQL ​​सर्वर से बात कर सकता हूं। उस प्लेटफॉर्म में, संग्रहित प्रक्रियाएं प्यारी होती हैं क्योंकि सर्वर निष्पादन योजना संग्रहीत करता है, जो ज्यादातर मामलों में प्रदर्शन को थोड़ा सा गति देता है। मैं "ज्यादातर मामलों में" कहता हूं, क्योंकि यदि एसपी में निष्पादन के व्यापक रूप से भिन्न तरीके हैं तो आपको उप-प्रदर्शन प्राप्त हो सकता है। हालांकि, यहां तक ​​कि उन मामलों में, एसपी के कुछ प्रबुद्ध रिफैक्टरिंग चीजों को गति दे सकते हैं।

    9

    यह एक बहस है जिस पर और अधिक क्रोध (उदाहरण के लिए, here)।

    खराब संग्रहित प्रक्रियाओं को लिखना आसान है क्योंकि यह आपके ऐप में खराब डेटा एक्सेस तर्क लिखना है।

    मेरी वरीयता संग्रहित प्रक्रियाओं के लिए है, लेकिन ऐसा इसलिए है क्योंकि मैं आमतौर पर एंटरप्राइज़ वातावरण में बहुत बड़े और जटिल ऐप्स के साथ काम कर रहा हूं जहां समर्पित डीबीए हैं जो डेटाबेस सर्वर को मीठा चलने के लिए जिम्मेदार हैं।

    अन्य स्थितियों में, मैं ऑप्टिमाइज़ेशन की देखभाल करने के लिए LINQ जैसे डेटा एक्सेस तकनीकों के लिए पर्याप्त खुश हूं।

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

    संपादित करें: जबकि फ़्रांस बोमा का लेख वास्तव में वर्बोज़ है, यह एक मील की सुरक्षा के संबंध में बिंदु को याद करता है। तथ्य यह है कि यह 5 साल का है, इसकी प्रासंगिकता में मदद नहीं करता है।

    2

    मैं एसपी का उपयोग करना पसंद करता हूं जब इसे उपयोग करने में समझदारी होती है। एसक्यूएल सर्वर में वैसे भी एसपी के पैरामीट्रिज्ड क्वेरी पर कोई प्रदर्शन लाभ नहीं है।

    हालांकि, मेरे वर्तमान काम पर मेरे मालिक ने उल्लेख किया कि हमें एसपी का उपयोग करने के लिए मजबूर होना पड़ता है क्योंकि हमारे ग्राहक की आवश्यकता होती है। उन्हें लगता है कि वे अधिक सुरक्षित हैं। मैं यह देखने के लिए काफी समय तक नहीं रहा हूं कि क्या हम भूमिका आधारित सुरक्षा लागू कर रहे हैं लेकिन मुझे एक भावना है जो हम करते हैं।

    तो ग्राहक की भावनाएं इस मामले में अन्य सभी तर्कों को टंप करती हैं।

    8

    संग्रहीत प्रक्रियाओं के लिए अधिकांश आधुनिक डेटाबेस पर पैरामीटरयुक्त या तैयार प्रश्नों के लिए कोई उल्लेखनीय गति अंतर नहीं है, क्योंकि डेटाबेस उन प्रश्नों के लिए निष्पादन योजनाओं को भी कैश करेगा।

    ध्यान दें कि एक पैरामीटरयुक्त क्वेरी विज्ञापन hql के समान नहीं है।

    मुख्य कारण आईएमओ अभी भी संग्रहित प्रक्रियाओं का पक्ष लेने के लिए सुरक्षा के साथ और अधिक है। यदि आप संग्रहीत प्रक्रियाओं का उपयोग विशेष रूप से का उपयोग करते हैं, तो आप अपने एप्लिकेशन के उपयोगकर्ता के लिए INSERT, SELECT, UPDATE, DELETE, ALTER, DROP, और CREATE आदि अनुमतियां अक्षम कर सकते हैं, केवल इसे EXECUTE के साथ छोड़ सकते हैं।

    यह द्वितीय क्रम एसक्यूएल इंजेक्शन के खिलाफ थोड़ा अतिरिक्त सुरक्षा प्रदान करता है। पैरामीटरेटेड प्रश्न केवल 1 ऑर्डर इंजेक्शन के विरुद्ध सुरक्षा करते हैं।

    4

    जाहिर है, वास्तविक प्रदर्शन को व्यक्तिगत मामलों में मापा जाना चाहिए, माना नहीं जाता है। लेकिन फिर भी ऐसे मामलों में जहां प्रदर्शन एक संग्रहीत प्रक्रिया द्वारा बाधा उत्पन्न है में, वहाँ उन्हें इस्तेमाल करने के लिए अच्छा कारण हैं:

    1. आवेदन डेवलपर्स हमेशा सर्वश्रेष्ठ एसक्यूएल कोडर नहीं हैं। संग्रहीत प्रक्रियाओं एप्लिकेशन से एसक्यूएल छुपाता है।

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

    3. संग्रहीत प्रक्रियाएं संकेत की एक परत बनाती हैं जो बाद में उपयोगी हो सकती है। आवेदन कोड को छूए बिना डेटाबेस पक्ष पर कार्यान्वयन विवरण (तालिका संरचना समेत) को बदलना संभव है।

    4. संग्रहित प्रक्रियाओं का निर्माण प्रणाली के लिए सभी डेटाबेस इंटरैक्शन दस्तावेज करने के लिए उपयोगी हो सकता है। और जब चीजें बदलती हैं तो दस्तावेज़ीकरण को अपडेट करना आसान होता है।

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

    0

    सीआरयूडी परिचालनों के लिए संग्रहीत प्रक्रियाओं का उपयोग करना शायद अधिक है, लेकिन यह उपयोग किए जाने वाले उपकरणों और आपकी प्राथमिकताओं (या आवश्यकताओं) पर निर्भर करेगा। मैं इनलाइन एसक्यूएल पसंद करता हूं, लेकिन मैं एसक्यूएल इंजेक्शन हमलों को रोकने के लिए पैरामीटरयुक्त प्रश्नों का उपयोग करना सुनिश्चित करता हूं। यदि आप सावधान नहीं हैं तो मैं क्या गलत हो सकता है इसके अनुस्मारक के रूप में मैं इस xkcd comic का प्रिंट आउट रखता हूं।

    संग्रहीत प्रक्रियाओं में वास्तविक प्रदर्शन लाभ हो सकते हैं जब आप डेटा के एक सेट को वापस करने के लिए डेटा के एकाधिक सेट के साथ काम कर रहे हों। क्लाइंट एंड पर संसाधित होने के लिए तार पर भेजने से संग्रहीत प्रक्रिया में डेटा के सेट को संसाधित करना आम तौर पर अधिक कुशल होता है।

    0

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

    0

    यह समझना प्रश्न के लिए थोड़ा सा विषय है, लेकिन यदि आप बहुत से संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं, तो सुनिश्चित करें कि उन्हें किसी प्रकार के स्रोत नियंत्रण (उदाहरण के लिए, उपवर्तन या गिट) के तहत रखने का एक सतत तरीका है। और उत्पादन प्रणाली में परीक्षण प्रणाली में अपने विकास प्रणाली से अद्यतन माइग्रेट करने में सक्षम हो।

    जब यह हाथ से किया जाता है, तो आसानी से ऑडिट करने का कोई तरीका नहीं है कि यह कोड कहां है, यह जल्दी से एक दुःस्वप्न बन जाता है।

    3

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

    +0

    जहां तक ​​मेरा संबंध है, डेटा और कोड जो डेटा में हेरफेर करते हैं, उसी सुरक्षा संदर्भ में मौजूद होना चाहिए। जब आप "ए = 1" और "ए + = 1" और "बी = ए" करते हैं तो आप "ए" पर विशेष सुरक्षा लागू नहीं करते हैं, तो आप डेटाबेस के अंदर डेटा के साथ ऐसा क्यों करना चाहिए? यह सिर्फ राम के लिए एक वैकल्पिक है। –

    0

    IMHO ...

    सीमित करने से संग्रहित प्रक्रियाओं के लिए "C_UD" प्रक्रिया के एक ही स्थान पर डेटा अखंडता तर्क रख सकते हैं। यह "सी_यूडी" संचालन को एक मध्यम बीच की परत पर सीमित करके भी किया जा सकता है।

    एप्लिकेशन को पढ़ें ऑपरेशन प्रदान किए जा सकते हैं ताकि वे केवल उन तालिकाओं/स्तंभों में शामिल हो सकें जिनकी उन्हें आवश्यकता है।

    0

    संग्रहित प्रक्रियाओं भी कुछ अन्य लाभ भी के लिए (एड-हॉक क्वेरी या) के बजाय पैरामिट्रीकृत प्रश्नों के लिए इस्तेमाल किया जा सकता है:

    • आप कुछ (एक प्रकार का आदेश आदि) सुधार करना है तो तुम नहीं अपने ऐप को रीकंपाइल करने की आवश्यकता
    • आप उस उपयोगकर्ता खाते के लिए सभी तालिकाओं तक पहुंच से इंकार कर सकते हैं, केवल संग्रहीत प्रक्रियाओं तक पहुंच प्रदान कर सकते हैं और संग्रहीत प्रक्रियाओं के माध्यम से सभी पहुंच को रूट कर सकते हैं। इस तरह आप तालिका की बाधाओं से अधिक लचीला सभी इनपुट का कस्टम सत्यापन कर सकते हैं। संग्रहित प्रक्रियाओं का उपयोग कर के लिए
    15

    कारण:

    • नेटवर्क यातायात कम - संपूर्ण नेटवर्क में SQL विवरण भेजना है। Sprocs के साथ, आप बैच में एसक्यूएल निष्पादित कर सकते हैं, जो भी अधिक कुशल है।
    • कैशिंग क्वेरी प्लान - पहली बार स्पोक निष्पादित किया गया है, SQL सर्वर एक निष्पादन योजना बनाता है, जिसे पुन: उपयोग के लिए कैश किया जाता है। यह अक्सर छोटे प्रश्नों के लिए अक्सर प्रदर्शन करने वाला होता है।
    • आउटपुट पैरामीटर का उपयोग करने की क्षमता - यदि आप इनलाइन एसक्यूएल भेजते हैं जो एक पंक्ति देता है, तो आप केवल एक रिकॉर्डसेट प्राप्त कर सकते हैं। स्पॉक्स के साथ आप उन्हें आउटपुट पैरामीटर के रूप में वापस ले सकते हैं, जो काफी तेज़ है।
    • अनुमतियां - जब आप इनलाइन एसक्यूएल भेजने के लिए, आप उपयोगकर्ता है, जो केवल देने की अनुमति की तुलना में अधिक पहुंच प्रदान करना है एक sproc तर्क के
    • पृथक्करण पर अमल करने के लिए तालिका (ओं) पर अनुमति प्रदान करने के लिए है - SQL-जनरेटिंग कोड को हटाएं और इसे डेटाबेस में विभाजित करें।
    • के बिना संपादित करने की क्षमता - यह विवादास्पद हो सकता है। आप एप्लिकेशन को पुन: संकलित किए बिना एसक्यूएल में एसक्यूएल को संपादित कर सकते हैं।
    • खोजें कि एक टेबल का उपयोग किया जाता है - स्पॉक्स के साथ, यदि आप किसी विशेष तालिका का संदर्भ देने वाले सभी SQL कथन ढूंढना चाहते हैं, तो आप स्पोक कोड निर्यात कर सकते हैं और इसे खोज सकते हैं। कोड में खोजने की कोशिश करने से यह बहुत आसान है।
    • अनुकूलन - एसक्यूएल को अनुकूलित करने के लिए डीबीए के लिए आसान है और स्पॉक्स का उपयोग होने पर डेटाबेस को ट्यून करना आसान है। लापता इंडेक्स और ऐसे ढूंढना आसान है।
    • एसक्यूएल इंजेक्शन हमले - सही ढंग से लिखित इनलाइन एसक्यूएल हमलों के खिलाफ बचाव कर सकते हैं, लेकिन इस सुरक्षा के लिए स्पॉक्स बेहतर हैं।
    +0

    आपका तीसरा बिंदु .. आप वास्तव में SQLCommand ऑब्जेक्ट से आउटपुट पैरामीटर वापस प्राप्त कर सकते हैं। यहां देखें: http://stackoverflow.com/questions/6815781/in-out-parameter-for-sqlcommand – user3308043

    -2

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

    कैशिंग - एमएस-एसक्यूएल उन्हें किसी भी तरह से इलाज नहीं करता है, क्योंकि एमएस-एसक्यूएल 2000 7 हो सकता है लेकिन मुझे याद नहीं है।

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

    पृथक्करण - लोग सवाल करेंगे कि आप मध्य स्तर के बाहर व्यवसाय तर्क क्यों डाल रहे हैं। इसके अलावा यदि आप डेटा हैंडलिंग कोड को अलग करना चाहते हैं तो इसे डेटाबेस में डाले बिना ऐसा करने के तरीके हैं।

    संपादित करने की क्षमता - आपके पास कोई परीक्षण और संस्करण नियंत्रण नहीं है जिसके बारे में आपको चिंता करना है? वेब साइट में समस्या नहीं है, क्लाइंट/सर्वर के साथ ही एक समस्या है।

    तालिका खोजें - केवल अगर आप इसका उपयोग करने वाले एसपी की पहचान कर सकते हैं, तो संस्करण नियंत्रण प्रणाली, एजेंट रैनैक या दृश्य स्टूडियो के टूल के साथ चिपके रहेंगे।

    अनुकूलन - आपके डीबीए को ऑप्टिमाइज़ेशन की आवश्यकता वाले प्रश्नों को ढूंढने के लिए डेटाबेस के टूल्स का उपयोग करना चाहिए। डाटाबेस डीबीए को बता सकता है कि कौन से वक्तव्य सबसे अधिक समय और संसाधनों की बात कर रहे हैं और वे वहां से ठीक हो सकते हैं। जटिल एसक्यूएल स्टेटमेंट्स के लिए प्रोग्रामर को डीबीए से बात करने के लिए कहा जाना चाहिए यदि सरल चयन इसके बारे में चिंता न करें।

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

    3

    2007 में मैं एक प्रोजेक्ट पर था, जहां हमने एक ओआरएम के माध्यम से एमएस एसक्यूएल सर्वर का उपयोग किया था। हमारे पास 2 बड़ी, बढ़ती हुई टेबल थीं जो SQL सर्वर पर लोड समय के 7-8 सेकेंड तक ले जाती थीं। 2 बड़े, संग्रहीत एसक्यूएल प्रक्रियाओं को बनाने और क्वेरी प्लानर से उन्हें अनुकूलित करने के बाद, प्रत्येक डीबी लोड समय 20 मिलीसेकंड से कम हो गया, इसलिए स्पष्ट रूप से संग्रहीत एसक्यूएल प्रक्रियाओं का उपयोग करने के लिए अभी भी दक्षता कारण हैं।

    यह कहकर, हमने पाया कि संग्रहित प्रक्रियाओं का सबसे महत्वपूर्ण लाभ अतिरिक्त रखरखाव-आसानी, सुरक्षा, डेटा-अखंडता, और मिडलवेयर-तर्क से व्यवसाय-तर्क को डीकॉप्लिंग करना था, जिससे सभी मिडलवेयर-तर्क को पुन: उपयोग से लाभ हुआ 2 प्रक्रियाओं में से।

    हमारे ओआरएम विक्रेता ने सामान्य दावा किया कि कई छोटे एसक्यूएल प्रश्नों को फायर करने से बड़े, डेटा सेट में शामिल होने से अधिक कुशल होने जा रहे थे। हमारे अनुभव (हमारे आश्चर्य के लिए) कुछ और दिखाया।

    यह निश्चित रूप से मशीनों, नेटवर्क, ऑपरेटिंग सिस्टम, एसक्यूएल सर्वर, एप्लिकेशन फ्रेमवर्क, ओआरएम फ्रेमवर्क और भाषा कार्यान्वयन के बीच भिन्न हो सकता है, इसलिए किसी भी लाभ को मापें, आपको लगता है कि आप कुछ और करने से प्राप्त कर सकते हैं।

    यह तब तक नहीं था जब तक हमने यह बेंचमार्क नहीं किया कि हमने पाया कि समस्या ओआरएम और डेटाबेस के बीच सभी भार ले रही थी।

    1

    मेरे लिए संग्रहीत प्रक्रियाओं का एक लाभ मेजबान भाषा अज्ञेयवादी होना है: आप अपने कोड को दोबारा लिखने के बिना किसी सी प्रोग्रामिंग भाषा में सी, पायथन, पीएचपी या किसी भी प्रोग्राम से स्विच कर सकते हैं। इसके अलावा, थोक परिचालन जैसी कुछ विशेषताएं वास्तव में प्रदर्शन में सुधार करती हैं और मेजबान भाषाओं में आसानी से उपलब्ध नहीं होती हैं (बिल्कुल नहीं?)।

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