2011-04-28 7 views
11

संभव डुप्लिकेट:SqlCommand.Prepare() क्या करता है और इसका उपयोग कब किया जाना चाहिए?

एसक्यूएल सर्वर का एक उदाहरण पर आदेश के लिए तैयार संस्करण बनाता है:
Pros and Cons of using SqlCommand Prepare in C#?

यह वही है MSDN says के बारे में SqlCommand.Prepare() है।

क्या कोई इसका अर्थ समझ सकता है कि इसका क्या अर्थ है और इसका उपयोग कब किया जाना चाहिए?

+0

संबंधित प्रश्न http://stackoverflow.com/questions/2449827/pros-and-cons-of-using-sqlcommand-prepare-in-c – MadBoy

उत्तर

10

Prepare method is actually on DbCommand, जो इससे प्राप्त सभी वर्ग उठाएंगे।

यह क्या करता है डेटाबेस प्रदाता के लिए विशिष्ट है कि DbCommand है। हालांकि, यह कहना सुरक्षित है (हालांकि पूर्ण नियम नहीं है) कि अधिकांश स्थानों में, यदि आदेश एक संग्रहीत प्रक्रिया है, तो यह कोई ऑप नहीं देगा (इसे override of Prepare on SqlCommand के लिए दस्तावेज किया गया है), क्योंकि संग्रहीत प्रक्रियाओं में आमतौर पर उनकी क्वेरी होती है योजनाओं को पूर्व कॉल, ऑप्टिमाइज़ करने के लिए स्पष्ट कॉल, या सृजन पर फिर से अनुकूलित किया गया है (फिर, अंतर्निहित डेटाबेस के आधार पर)।

हालांकि, अगर आप कर रहे हैं नहीं एक संग्रहीत प्रक्रिया का उपयोग कर, बल्कि एक पैरामिट्रीकृत ऑन-द-मक्खी उत्पन्न क्वेरी, तो यह कॉल अंतर्निहित डेटाबेस क्वेरी की एक अनुकूलित संस्करण उत्पन्न करने के लिए अवसर प्रदान करेगा।

आप आमतौर पर ऐसा करेंगे जब आप जानते हैं कि आप कम समय के भीतर कई बार आदेश निष्पादित करने जा रहे हैं (यह वास्तव में, डेटाबेस पर निर्भर करता है, और क्वेरी योजनाओं को कितनी देर तक कैश किया जाता है)।

यह कहा जाना चाहिए कि SQL सर्वर (2005 तक, आईआईआरसी) पहली निष्पादन के बाद उपयोग के आधार पर पैरामीटरयुक्त क्वेरी योजनाओं को कैश करता है (मुझे लगता है कि कैश एक समय-अपघृत कैश है जो रीसेट करता है या इसकी क्षय दर धीमी होती है बाद के उपयोग), इसलिए यदि आप एक ही पैरामीटरयुक्त क्वेरी के साथ कई कॉल करने जा रहे हैं, तो आपको क्वेरी तैयारी कार्य को आगे बढ़ाने के अलावा Prepare पर कॉल के साथ अधिक लाभ नहीं हो सकता है (जो कि लाभ भी हो सकता है, इसके आधार पर काम आपको करना है)।

+1

जब आप अलग-अलग पैरामीटर के साथ कई बार संग्रहीत प्रक्रियाओं का उपयोग करते हैं, तो मैं तैयार करता हूं तरीका। यदि आप केवल पैरामीटर बदलते हैं, तो परिणाम अभी भी पैरामीटर के पहले सेट का होगा। मुझे नहीं पता कि यह करने का यह सबसे अच्छा तरीका है, लेकिन किसी भी तरह से यह विधि किसी संग्रहीत प्रक्रिया पर उपयोग किए जाने पर नो-ऑप नहीं है। (दस्तावेज़ीकरण कहता है कि यह हो सकता है कि यह नो-ऑप नहीं है।) – pikachu

2

आम तौर पर जब आप कोई क्वेरी निष्पादित करते हैं, तो इसे निष्पादन योजना चलाने के लिए स्ट्रिंग को पार्स करने से सभी तरह से लिया जाता है। Prepare पर कॉल करके, यह निष्पादन की दिशा में यथासंभव प्रक्रिया को ले जाएगा, वास्तव में निष्पादन योजना के बिना।

यह वही आदेश चलाते समय उपयोगी होता है। आप कुछ निष्पादन समय बचाएंगे, क्योंकि पूरी प्रक्रिया को हर बार दोहराना नहीं पड़ता है।

7

अधिक जानकारी here मिल सकती है।

हालांकि, ध्यान भालू:

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

एक की पहचान संभाल द्वारा एक कार्य योजना लागू करके ढूँढना मौजूदा निष्पादन योजनाओं के लिए एक SQL विवरण का मिलान किया एल्गोरिथम की तुलना में अधिक कुशल है।

एप्लिकेशन नियंत्रण कर सकता है जब निष्पादन योजना बनाई जाती है और जब यह पुन: उपयोग किया जाता है।

तैयार/निष्पादित मॉडल पोर्टेबल अन्य डेटाबेस में है, जिसमें पहले SQL Server के संस्करण शामिल हैं।

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