जब मैं उनके साथ WHERE क्लॉज जोड़ता हूं, तो क्या वे अनुकूलित होते हैं?


28

अगर आप व्यू के अंदर या बाहर कोई फ़िल्टर करते हैं तो क्या इससे कोई फ़र्क पड़ता है?

उदाहरण के लिए, क्या इन दोनों प्रश्नों में कोई अंतर है?

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

या

SELECT Id
FROM MyView
WHERE SomeColumn = 1

और MyViewके रूप में परिभाषित किया गया है

SELECT Id, SomeColumn
FROM MyTable

और क्या उत्तर किसी भी भिन्न है यदि स्रोत तालिका एक लिंक्ड सर्वर पर स्थित है?

मैं पूछ रहा हूं क्योंकि मुझे एक लिंक किए गए सर्वर से दो बार एक बड़ी तालिका (44mil पंक्तियों) को क्वेरी करना है, और परिणामों का एक कुल प्राप्त करना है। मैं जानना चाहता हूं कि क्या मुझे डेटा तक पहुंचने के लिए दो दृश्य बनाने चाहिए, प्रत्येक क्वेरी के लिए, या अगर मैं एक दृश्य और एक WHEREखंड के साथ दूर हो सकता हूं ।


1
अगर आप इसमें केवल एक टेबल रखते हैं तो आप एक दृश्य का उपयोग क्यों करेंगे?
HLGEM

3
@HLGEM सुरक्षा?
जेएनके

2
@HLGEM देखें वास्तव में विभिन्न सर्वरों पर कई डेटाबेस के लिए कई प्रश्न होते हैं, और यह उन सभी को एक से जोड़ता है UNION ALL। जब भी मुझे डेटा की आवश्यकता होती है, तो UNION क्वेरी को फिर से लिखने के लिए किसी व्यू का उपयोग करना बहुत आसान है।
राचेल

यह भी देखें stackoverflow.com/a/6654525/27535
gbn

1
@datagod मैं इसे ध्यान में रखूंगा, धन्यवाद :) इस मामले में, एक काफी छोटा ऐप है जो सर्वरों के एक समूह से डेटा इकट्ठा करता है, कुछ गणना चलाता है, और रिपोर्टों का एक गुच्छा निकालता है। इसका अपना डेटाबेस है क्योंकि कुछ गणनाएँ काफी गहन संसाधन हैं, और मैं इसे हर चीज से अलग करना चाहता था।
राचेल

जवाबों:


12

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

अब, डेटा प्रकार और चयनात्मकता के आधार पर MyColumn, यदि आप बेस टेबल पर फ़िल्टर किए गए इंडेक्स बनाना चाहते हैं (जब आप SQL सर्वर 2008+ पर जाते हैं), तो आपको बेहतर प्रदर्शन मिल सकता है, लेकिन यह फिर से देखने के माध्यम से अलग नहीं होगा या बिना


3
इस सवाल के बारे में क्या है , जो पूछ रहा है कि whereदृश्य के बाहर खंड के साथ एक क्वेरी इतनी अधिक क्यों लगती है जब इसे दृश्य में रखा जाता है?
राचेल

1
यदि विचार प्रदर्शन के लिए नहीं हैं तो वे सिर्फ संरचना के लिए हैं?
profimedica

1
@profimedica अनुक्रमित विचार प्रदर्शन कारणों से बनाए जा सकते हैं (जैसे कि रनटाइम पर उनकी गणना करने के बजाय समुच्चय जैसे मध्यस्थ परिणाम संग्रहीत करने के लिए)। यदि कोई दृश्य भौतिक नहीं है, तो यह कई कारणों से हो सकता है: DRY (कई अलग-अलग प्रश्नों में सामान्य जॉइन या फ़िल्टर), सुरक्षा, ऑबफ्यूज़ेशन, स्कीमा सरलीकरण।
हारून बर्ट्रेंड

5

यहां केवल एक त्वरित उदाहरण दिखाया गया है कि कोई अंतर नहीं होना चाहिए। डेटाबेस AdventureWorksडेटाबेस है।

दो देखें परिभाषाएँ:

create view Person.vContactWhere
as

    select *
    from person.Contact
    where ContactID = 24

go

create view Person.vContactNoWhere
as

    select *
    from person.Contact

go

यहाँ पहली क्वेरी होगी, जिसमें WHEREक्लॉज़ व्यू डेफिनिशन में शामिल हैं:

select *
from person.vContactWhere

यहाँ निष्पादन योजना है:

यहाँ छवि विवरण दर्ज करें

और दूसरी क्वेरी, WHEREक्लॉज़ के साथ दृश्य परिभाषा में नहीं, बल्कि SELECTक्वेरी में:

select *
from person.vContactNoWhere
where ContactID = 24

यह है कि निष्पादन योजना:

यहाँ छवि विवरण दर्ज करें

जैसा कि आप इन निष्पादन योजनाओं से देख सकते हैं, वे समान परिणामों के साथ समान हैं। मैं ऐसी स्थिति के बारे में नहीं जानता जहाँ इस प्रकार के तर्क / डिज़ाइन के अलग-अलग परिणाम होंगे। इसलिए मैं यह कहना चाहूंगा कि आप किसी भी तरह से सुरक्षित हैं, और व्यक्तिगत प्राथमिकता (या दुकान प्रक्रियाओं) के साथ जाएं।


1
इस सवाल के बारे में क्या है , जो पूछ रहा है कि whereदृश्य के बाहर खंड के साथ एक क्वेरी इतनी अधिक क्यों लगती है जब इसे दृश्य में रखा जाता है?
राचेल

1
@ रायचेल मुझे लगता है कि gbn ने अपनी पोस्ट में इसे अच्छी तरह समझाया, और जिस लेख की ओर उन्होंने इशारा किया। मुझे नहीं पता कि इसे और कैसे लगाया जाए।
थॉमस स्ट्रिंगर

मैंने इसे इसलिए जोड़ा क्योंकि उस मामले में, निष्पादन योजनाएं समान नहीं थीं, जो आपके उत्तर के अनुसार अलग है।
राचेल

1
@ Rachel उस उदाहरण में समस्या एक लापता परिवर्तन नियम है । यह सिर्फ विचारों पर ही नहीं बल्कि CTE और अन्य टेबल एक्सप्रेशन पर भी लागू होता है। सामान्य स्थिति में यह रैंकिंग कार्यों से युक्त तालिका अभिव्यक्तियों में विधेय को नीचे धकेलने के लिए मान्य नहीं है क्योंकि इससे परिणाम बदल जाएगा। इस मामले में यह मान्य है क्योंकि Whereक्लॉज फिट बैठता है PARTITION BY। SQL Server 2008 के SelOnSeqPrjलिए इस विशेष मामले को पहचानने के लिए एक नया नियम है।
मार्टिन स्मिथ


2

मैं जो पढ़ रहा हूं , उसके आधार पर निष्पादन योजना का निर्धारण करते समय SQL एक उप क्वेरी की तरह एक मानक दृश्य का उपयोग करेगा।

तो मेरे उदाहरण क्वेरी का उपयोग करते हुए,

SELECT Id
FROM MyView
WHERE SomeColumn = 1

जहां MyViewके रूप में परिभाषित किया गया है

SELECT Id, SomeColumn
FROM MyTable

इसे उसी निष्पादन योजना के रूप में उत्पन्न करना चाहिए

SELECT Id
FROM 
(
    SELECT Id, SomeColumn
    FROM MyTable
) as T
WHERE SomeColumn = 1

लेकिन यह क्रियान्वयन योजना इससे अलग हो सकती है जो इसके साथ उत्पन्न होगी

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

मुझे यकीन नहीं है कि अगर यह जवाब अनुक्रमित दृश्यों के लिए समान होगा


मुझे नहीं लगता कि यह एक स्पष्ट पाठ प्रतिस्थापन है।
हारून बर्ट्रेंड

@AaronBertrand आप सही हो सकते हैं। मुझे ईमानदारी से कोई पता नहीं है ... मैं सीख रहा हूं जैसा कि मैं जाता हूं :) यह धारणा अन्य चीजों पर आधारित थी जो मैं पढ़ रहा हूं कि मैक्रोज़ कैसे हैं। मैंने यह निर्दिष्ट करने के लिए प्रश्न को थोड़ा संपादित किया कि मैं मानक विचारों का उल्लेख कर रहा हूं, न कि अनुक्रमित विचार।
राहेल

@ राचेल - प्रतिस्थापन बीजगणित वृक्ष के साथ होता है न कि एक पाठकीय स्तर पर।
मार्टिन स्मिथ

@MartinSmith Hrrmm यह नहीं है कि मैंने क्या कहा? कि निष्पादन की योजना समान होनी चाहिए, न कि यह कि पाठ समान होगा? मुझे यकीन नहीं है कि मैं "बीजगणित पेड़" समझ रहा हूँ
राहेल

यह सिर्फ क्यू पर आपकी टिप्पणी के जवाब में था जो कहता है कि यह "आपके प्रश्न में एक दृश्य का पाठ सम्मिलित करता है" और आरोन की टिप्पणी ऊपर। पार्स / संकलन चरणों के बारे में कुछ जानकारी यहाँ । वास्तव में आपके उत्तर में पाठ प्रतिस्थापन का भी उल्लेख है। क्या यह बनाने लायक अंतर है। निश्चित नहीं! लेकिन मुझे लगता है कि यह बताता है कि sp_refreshviewपाठ प्रतिस्थापन अवधारणा की आवश्यकता क्यों नहीं है।
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.