एक संग्रहीत प्रक्रिया और एक दृश्य के बीच अंतर क्या है?


138

मैं कुछ बिंदुओं को लेकर उलझन में हूं:

  1. एक संग्रहीत प्रक्रिया और एक दृश्य के बीच अंतर क्या है?

  2. मुझे SQL सर्वर में संग्रहीत कार्यविधियों का उपयोग कब करना चाहिए, और मुझे दृश्यों का उपयोग कब करना चाहिए?

  3. क्या विचार गतिशील प्रश्नों के निर्माण की अनुमति देते हैं जहां हम मापदंडों को पारित कर सकते हैं?

  4. कौन सा सबसे तेज है, और किस आधार पर दूसरे की तुलना में तेज है?

  5. क्या दृश्य या संग्रहीत प्रक्रियाएं स्थायी रूप से मेमोरी आवंटित करती हैं?

  6. इसका क्या मतलब है अगर कोई कहता है कि दृश्य एक आभासी तालिका बनाते हैं, जबकि प्रक्रियाएं सामग्री तालिका बनाती हैं?

कृपया मुझे और बिंदुओं के बारे में बताएं, यदि कोई हो।

जवाबों:


144

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

एक संग्रहीत कार्यविधि एक फ़ंक्शन को करने के लिए मापदंडों का उपयोग करती है ... चाहे वह अपडेट कर रही हो और डेटा सम्मिलित कर रही हो, या एकल मान या डेटा सेट लौटा रही हो।

दृश्य और संग्रहित प्रक्रियाएँ बनाना - Microsoft की कुछ जानकारी है कि कब और क्यों प्रत्येक का उपयोग करना है।

कहो कि मेरे पास दो टेबल हैं:

  • tbl_user, कॉलम के साथ: user_id, user_name,user_pw
  • tbl_profile, कॉलम के साथ: profile_id, user_id,profile_description

इसलिए, अगर मैं अपने आप को उन तालिकाओं से बहुत कुछ खोजता हूं ... तो एसक्यूएल के हर टुकड़े में शामिल होने के बजाय, मैं एक दृश्य को परिभाषित करूंगा जैसे:

CREATE VIEW vw_user_profile
AS
  SELECT A.user_id, B.profile_description
  FROM tbl_user A LEFT JOIN tbl_profile B ON A.user_id = b.user_id
GO

इस प्रकार, यदि मैं क्वेरी करना चाहते profile_descriptionद्वारा user_idभविष्य में, सभी मुझे क्या करना है:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

उस कोड को संग्रहीत कार्यविधि में उपयोग किया जा सकता है जैसे:

CREATE PROCEDURE dbo.getDesc
    @ID int
AS
BEGIN
    SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

इसलिए, बाद में, मैं कॉल कर सकता हूं:

dbo.getDesc 25

और मुझे user_id25 के लिए विवरण मिलेगा , जहां 25आपका पैरामीटर है।

स्पष्ट रूप से बहुत अधिक विस्तार है, यह सिर्फ मूल विचार है।


1
लेकिन मैं शामिल हो सकते हैं कई तालिका में संग्रहीत कार्यविधि में शामिल हो सकते हैं और जहां मुझे पैरामीटर नहीं देना है।
NoviceToDotNet

5
लेकिन आप ऐसा क्यों करेंगे? आप क्या खत्म करने की कोशिश कर रहे हैं? आप एक तालिका के रूप में एक दृश्य का उपयोग कर सकते हैं ... संग्रहीत कार्यविधियां चीजों को करने के लिए हैं ... विचार आपके जीवन को आसान बनाने के लिए हैं।
पैट्रिक

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

2
मुझे नहीं मिल रहा है, कृपया थोड़ा और वर्णन करें।
NoviceToDotNet

2
सही है, लेकिन यह आपके विचार को तब रोकता है ... ताकि आप इसे एक ही तालिका की तरह कह सकें। इस तरह से आप एक बार अपनी जॉइन को क्रिएट कर लेते हैं, और कोई भी भविष्य के संदर्भ को सीधे उपयोग करता है जो अंतर्निहित sql को कॉल करता है जैसे कि यह एक टेबल था।
पैट्रिक

107

बहुत सारी जानकारी यहाँ उपलब्ध है

यहाँ एक अच्छा सारांश है:

एक संग्रहीत प्रक्रिया:

  • मापदंडों को स्वीकार करता है
  • कर सकते हैं नहीं एक बड़ा प्रश्न में ब्लॉक के निर्माण के रूप में इस्तेमाल किया
  • कई कथन, लूप, IF ELSE आदि हो सकते हैं।
  • एक या कई तालिकाओं में संशोधन कर सकते हैं
  • INSERT, UPDATE या DELETE स्टेटमेंट के लक्ष्य के रूप में उपयोग नहीं किया जा सकता है।

एक दृश्य:

  • करता नहीं पैरामीटर स्वीकार
  • एक बड़ी क्वेरी में बिल्डिंग ब्लॉक के रूप में इस्तेमाल किया जा सकता है
  • इसमें केवल एक ही चयनित क्वेरी हो सकती है
  • किसी तालिका में संशोधन नहीं कर सकते
  • लेकिन क्या (कभी-कभी) का उपयोग INSERT, UPDATE या DELETE स्टेटमेंट के लक्ष्य के रूप में किया जा सकता है।

6
इसके अलावा, किसी भी "आदेश" या "शीर्ष" खंड को शामिल नहीं करना चाहिए
sksallaj

2
"INSERT, UPDATE या DELETE स्टेटमेंट के लक्ष्य के रूप में उपयोग नहीं किया जा सकता है" से क्या मतलब है? क्या हम INSERT, DELETE, UPDATE को Stored Procedure में उपयोग नहीं कर सकते हैं?
अरस्मान अहमद

"एक दृश्य, मापदंडों को स्वीकार नहीं करता है", यह सच नहीं है? उदाहरण के लिए वीडियो: youtube.com/watch?v=zK-mWjUxKpw
xayer

दृश्य बेस टेबल / तालिकाओं में संशोधन कर सकते हैं: csharp-video-tutorials.blogspot.com/2012/09/…
खुर्रम

8

पहले आपको समझने की जरूरत है, कि दोनों अलग चीजें हैं। बयान के Stored Proceduresलिए सबसे अच्छा उपयोग किया जाता है INSERT-UPDATE-DELETE। जबकि बयान के Viewsलिए उपयोग किया जाता है SELECT। आपको दोनों का उपयोग करना चाहिए।

विचारों में आप डेटा को बदल नहीं सकते। कुछ डेटाबेस updatable दृश्य जहां उपयोग कर सकते हैं INSERT-UPDATE-DELETEपर Views


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

7

SQL व्यू एक वर्चुअल टेबल है, जो SQL SELECT क्वेरी पर आधारित है। एक दृश्य एक या अधिक मौजूदा डेटाबेस तालिकाओं या अन्य विचारों को संदर्भित करता है। यह डेटाबेस का स्नैप शॉट है, जबकि एक संग्रहीत कार्यविधि एक निष्पादन योजना में संकलित लेनदेन-एसक्यूएल बयानों का एक समूह है।

देखें डेटाबेस तालिका में संग्रहीत डेटा को सरल दिखा रहा है जबकि एक संग्रहीत कार्यविधि कथनों का एक समूह है जिसे निष्पादित किया जा सकता है।

एक दृश्य तेज है क्योंकि यह संदर्भित तालिकाओं से डेटा प्रदर्शित करता है जबकि एक स्टोर प्रक्रिया एसक्यूएल स्टेटमेंट निष्पादित करती है।

इस लेख की जाँच करें: देखें बनाम संग्रहीत कार्यविधियाँ । बिल्कुल वही जो आप ढूंढ रहे हैं


5

एक दृश्य SELECTडेटाबेस में एक जटिल को बचाने का एक सरल तरीका है ।

एक स्टोर प्रक्रिया का उपयोग तब किया जाता है जब सरल SQL बस पर्याप्त नहीं होता है। स्टोर प्रक्रियाओं में अन्य संग्रहीत प्रक्रियाओं के लिए चर, लूप और कॉल होते हैं। यह एक प्रोग्रामिंग भाषा है, क्वेरी भाषा नहीं है।

  1. दृश्य स्थिर हैं। उन्हें एक निश्चित लेआउट के साथ नई तालिकाओं के रूप में सोचें और उनमें मौजूद डेटा को आपके द्वारा बनाई गई क्वेरी का उपयोग करके मक्खी पर बनाया गया है। किसी भी एसक्यूएल टेबल के साथ, आप इसे सॉर्ट और फ़िल्टर कर सकते हैं WHERE, GROUP BYऔर ORDER BY

  2. आप क्या करते हैं इस पर निर्भर करता है।

  3. डेटाबेस पर निर्भर करता है। सरल दृश्य केवल क्वेरी चलाते हैं और परिणाम को फ़िल्टर करते हैं। लेकिन ओरेकल जैसे डेटाबेस एक "भौतिकवादी" दृश्य बनाने की अनुमति देते हैं जो मूल रूप से एक तालिका है जो दृश्य के अंतर्निहित डेटा में परिवर्तन होने पर स्वचालित रूप से अपडेट होती है।

    एक भौतिकीकृत दृश्य आपको दृश्य के स्तंभों पर अनुक्रमणिका बनाने की अनुमति देता है (विशेष रूप से गणना किए गए स्तंभों पर जो डेटाबेस में कहीं भी मौजूद नहीं है)।

  4. मुझे समझ नहीं आ रहा है कि आप किस बारे में बात कर रहे हैं।


5

उपरोक्त टिप्पणियों के अलावा, मैं दृश्यों के बारे में कुछ बिंदुओं को जोड़ना चाहूंगा।

  1. जटिलता को छिपाने के लिए दृश्यों का उपयोग किया जा सकता है। एक परिदृश्य की कल्पना करें जहां 5 लोग एक परियोजना पर काम कर रहे हैं, लेकिन उनमें से केवल एक जटिल सामान जैसे डेटाबेस सामान के साथ बहुत अच्छा है। ऐसे परिदृश्य में, वह ऐसे दृश्य बना सकता है, जिन्हें टीम के अन्य सदस्यों द्वारा आसानी से समझा जा सकता है क्योंकि वे किसी एक तालिका को क्वेरी कर रहे हैं।
  2. दृश्य द्वारा सुरक्षा को आसानी से लागू किया जा सकता है। मान लीजिए कि हम एक टेबल कर्मचारी हैं जिसमें संवेदनशील कॉलम जैसे वेतन , एसएसएन नंबर शामिल हैं । ये कॉलम उन उपयोगकर्ताओं के लिए दृश्यमान नहीं हैं, जो उन्हें देखने के लिए अधिकृत नहीं हैं। ऐसे मामले में, हम एक तालिका में स्तंभों का चयन करते हुए एक दृश्य बना सकते हैं , जिसमें संवेदनशील कॉलम (जैसे वेतन आदि) का उल्लेख किए बिना, हमें नाम , आयु आदि जैसे किसी भी प्राधिकरण की आवश्यकता नहीं है । अब हम टेबल एंप्लॉयी को सीधे क्वेरी करने की अनुमति को हटा सकते हैं और केवल व्यू पर रीड की अनुमति को रख सकते हैं। इस तरह, हम दृश्यों का उपयोग करके सुरक्षा को लागू कर सकते हैं।

4
  1. एक दृश्य एक गतिशील क्वेरी है, जहां आप "WHERE" का उपयोग कर सकते हैं -कॉलेज
  2. एक संग्रहीत प्रक्रिया एक निश्चित डेटा चयन है, जो एक पूर्वनिर्धारित परिणाम देता है
  3. न ही कोई दृश्य, और न ही संग्रहीत प्रक्रिया स्मृति को आवंटित करती है। केवल एक भौतिकवादी दृश्य
  4. एक टेबल सिर्फ एक ENTITY है, एक दृश्य विभिन्न ENTITIES या TABLES से डेटा एकत्र कर सकता है

4

महेश तब बिलकुल सही नहीं थे जब उन्होंने सुझाव दिया कि आप डेटा को किसी दृश्य में बदल नहीं सकते। तो पैट्रिक की दृष्टि से

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

मैं डेटा को अपडेट कर सकता हूं ... एक उदाहरण के रूप में मैं इनमें से किसी एक को भी कर सकता हूं ...

Update vw_user_profile Set profile_description='Manager' where user_id=4

या

Update tbl_profile Set profile_description='Manager' where user_id=4

आप इस दृश्य के लिए सम्मिलित नहीं कर सकते हैं क्योंकि तालिका के सभी फ़ील्ड मौजूद नहीं हैं और मैं मान रहा हूँ कि PROFILE_ID प्राथमिक कुंजी है और NULL नहीं हो सकती। हालाँकि आप कभी-कभी INSERT को एक दृश्य में देख सकते हैं ...

मैंने एक मौजूदा तालिका का उपयोग करके एक दृश्य बनाया ...

Create View Junk as SELECT * from [TableName]

फिर

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

तथा

DELETE from Junk Where ID>4

इस मामले में INSERT और DELETE दोनों ने काम किया

स्पष्ट रूप से आप किसी भी फ़ील्ड को अपडेट नहीं कर सकते हैं जो कि एकत्रित या गणना की गई है, लेकिन कोई भी दृश्य जो सिर्फ एक सीधा दृश्य है, अपग्रेड करने योग्य होना चाहिए।

यदि दृश्य में एक से अधिक तालिकाएँ हैं, तो आप सम्मिलित या हटा नहीं सकते हैं, लेकिन यदि दृश्य केवल एक तालिका का सबसेट है, तो आप आमतौर पर कर सकते हैं।


3

मुख्य अंतर यह है कि जब आप किसी दृश्य को क्वेरी कर रहे होते हैं तो यह परिभाषा आपकी क्वेरी में चिपका दी जाती है। प्रक्रिया क्वेरी के परिणाम भी दे सकती है, लेकिन यह संकलित है और इतनी तेजी से है। एक अन्य विकल्प अनुक्रमित विचार हैं।


1

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

संग्रहीत कार्यविधियाँ अपने सभी प्रसंस्करण या तो Tem Hash Table जैसे # tmpTable1 का उपयोग करके या @ tmpTable1 का उपयोग करके स्मृति में करती हैं। आप जो करना चाहते हैं, उसके आधार पर।

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

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

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