ORDER BY एक दृश्य में क्यों नहीं है?


51

मैं समझता हूं कि आपके पास ORDER BY एक दृश्य नहीं हो सकता है । (कम से कम SQL सर्वर 2012 में मैं साथ काम कर रहा हूं)

मैं यह भी समझता हूं कि किसी दृश्य को छांटने का "सही" तरीका दृश्य को क्वेरी करते ORDER BYहुए SELECTविवरण के आसपास है ।

लेकिन व्यावहारिक एसक्यूएल और विचारों के उपयोग के लिए अपेक्षाकृत नया होने के नाते, मैं यह समझना चाहता हूं कि ऐसा डिजाइन द्वारा क्यों किया गया है। यदि मैंने इतिहास का सही ढंग से पालन किया है, तो यह एक बार संभव था और इसे SQL सर्वर 2008 से और इतने पर हटा दिया गया था (सटीक संस्करण पर मुझे उद्धृत न करें)।

हालाँकि, सबसे अच्छा कारण मैं यह बता सकता हूं कि Microsoft ने इस सुविधा को क्यों हटाया क्योंकि "एक दृश्य डेटा का एक संग्रह है"।

मैं मान रहा हूं कि एक अच्छा, तार्किक कारण है कि एक दृश्य को क्यों न हटाया जाए। सिर्फ डेटा का संग्रह करने के लिए एक दृश्य क्यों नहीं देखा जा सकता है? विशेष रूप से संयुक्त राष्ट्र क्यों ? ऐसा लगता नहीं है कि ऐसी परिस्थितियों के साथ आना मुश्किल है, जहां (कम से कम मुझे / आईएमएचओ को) यह एक छांटे गए दृश्य के लिए पूरी तरह से सहज लगता है।


2
पहला जवाब एकदम सही है। मेरा सुझाव है कि यदि आप एक दृश्य ऑर्डर करना चाहते हैं तो आप ऐसा क्यों नहीं करते हैं। [कॉलम] का चयन करें [YourView] ऑर्डर [[कॉलम] से
ज़ेन

संक्षिप्त उत्तर: "उसी कारण से जो ORDER BY किसी तालिका से संबंधित नहीं है।"
ypercube y

जवाबों:


38

(निश्चित रूप से अनुक्रमित विचार।)

एक दृश्य भौतिक नहीं है - डेटा संग्रहीत नहीं है, इसलिए इसे कैसे सॉर्ट किया जा सकता है? एक दृश्य एक संग्रहीत प्रक्रिया की तरह है जिसमें बस SELECTकोई पैरामीटर नहीं है ... यह डेटा नहीं रखता है, यह सिर्फ क्वेरी की परिभाषा रखता है। चूंकि दृश्य के अलग-अलग संदर्भों को अलग-अलग तरीकों से छांटे गए डेटा की आवश्यकता हो सकती है, जिस तरह से आप ऐसा करते हैं - ठीक उसी तरह जैसे तालिका से चयन करना, जो कि पंक्तियों का एक अनसुलझा संग्रह है, परिभाषा के अनुसार - बाहरी क्वेरी द्वारा आदेश को शामिल करना है ।

इतिहास में थोड़ी जानकारी देने के लिए भी। आप कभीORDER BY भी शामिल किए बिना, एक दृश्य में नहीं डाल सकते TOP। और इस मामले में ORDER BYतय किया गया था कि कौन सी पंक्तियों को शामिल किया गया है TOP, न कि उन्हें कैसे प्रस्तुत किया जाएगा। यह बस इतना हुआ कि SQL Server 2000 में, यदि TOPथा , 100 PERCENTया {some number >= number of rows in the table}, अनुकूलक काफी सरल था और इसने उस तरह के मेल से एक योजना का निर्माण किया TOP/ORDER BY। लेकिन इस व्यवहार की गारंटी या दस्तावेज कभी नहीं थे - यह केवल अवलोकन पर आधारित था, जो एक बुरी आदत है । जब SQL सर्वर 2005 बाहर आया, तो यह व्यवहार "ब्रेकिंग" शुरू हो गया क्योंकि ऑप्टिमाइज़र में बदलाव के कारण विभिन्न योजनाओं और ऑपरेटरों का उपयोग किया जा रहा था - अन्य बातों के अलावा,TOP / ORDER BYपूरी तरह से नजरअंदाज किया जाएगा अगर यह था TOP 100 PERCENT। कुछ ग्राहकों ने इसके बारे में इतनी जोर से शिकायत की कि Microsoft ने पुराने व्यवहार को बहाल करने के लिए एक ट्रेस ध्वज जारी किया। मैं आपको यह बताने नहीं जा रहा हूं कि झंडा क्या है क्योंकि मैं नहीं चाहता कि आप इसका उपयोग करें और मैं यह सुनिश्चित करना चाहता हूं कि इरादा सही हो - यदि आप पूर्वानुमान योग्य क्रमबद्ध ऑर्डर चाहते हैं, ORDER BYतो बाहरी क्वेरी पर उपयोग करें ।

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


यहाँ उल्लेख किया गया है (एक टिप्पणी में) कि TOPपरिणाम सेट पर एक कर्सर ऑपरेशन करता है। वहाँ यह एक स्पष्ट आदेश हो सकता है।
टिम श्मेल्टर

@TimSchmelter जब ऑप्टिमाइज़र को देखता है TOP 100 PERCENT / ORDER BYऔर योजना से पूरी तरह से हटा देता है तो यह मदद नहीं करता है । कोशिश करके देखो।
हारून बर्ट्रेंड

यह सिर्फ एक सिद्दत थी। बाकी की टिप्पणी इस प्रकार है: "SELECT TOP x ट्रिक को SQL सर्वर के भविष्य के संस्करण में अपग्रेड किया जाना तय है, इसलिए यह सबसे अच्छा होगा कि इसका उपयोग बिल्कुल न करें।"
टिम श्मेल्टर

@TimSchmelter यह पहले से ही एक सेशन नहीं है। मुझे नहीं लगता कि यह किसी भी नए संस्करण में जल्द ही काम करना बंद कर देगा, क्योंकि यह बहुत अधिक मौजूदा कोड को तोड़ देगा।
हारून बर्ट्रेंड

2
@TimSchmelter वहाँ आदेश पंक्तियों के क्रम के बारे में बात नहीं कर रहा है, यह एक पंक्ति के भीतर स्तंभों के क्रम के बारे में बात कर रहा है। SQL सर्वर में हम आम तौर पर एक पंक्ति के टपल होने के बारे में बात नहीं करते हैं क्योंकि एक पंक्ति का भौतिक कार्यान्वयन हमारे लिए इतना स्पष्ट है (तालिका आपके द्वारा परिभाषित क्रम में स्तंभों को सूचीबद्ध करती है)।
हारून बर्ट्रेंड

9

यदि किसी दृश्य को क्रमबद्ध करने की अनुमति दी गई थी तो यहां परिणाम का क्रम क्या होना चाहिए?

CREATE VIEW dbo.V1
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number ASC

GO

CREATE VIEW dbo.V2
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number DESC

GO

SELECT *
FROM   dbo.V1
       JOIN dbo.V2
         ON V1.number = V2.number 

मुझे यह बात समझ में नहीं आती। डेटाबेस दृश्य लिखने के बजाय, आप सामान्य sql क्वेरी लिख सकते हैं। तो उस स्थिति में परिणाम का क्रम क्या होना चाहिए? धन्यवाद
१६:१६ को ०५:५०

7

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

एक और कारण, सॉर्ट प्रदर्शन लागत के साथ आता है, इसलिए दृश्य के सभी उपयोगकर्ताओं को दंडित क्यों किया जाता है, जब केवल कुछ उपयोगकर्ताओं को सॉर्ट की आवश्यकता होती है ..


5

ANSI SQL केवल ORDER BYविभिन्न कारणों से सबसे बाहरी क्वेरी पर अनुमति देता है, एक तब होता है जब सबसेक्ट / व्यू / CTE दूसरी तालिका में शामिल हो जाता है और बाहरी क्वेरी ORDER BYस्वयं होती है।

SQL सर्वर ने इसे कभी भी एक दृश्य के अंदर समर्थित नहीं किया (जब तक कि आपने इसका उपयोग नहीं किया है, TOP 100 PERCENTजो मेरी राय में ज्यादातर बग को ट्रिगर करता है)।

यहां तक ​​कि अगर आपने बग को ट्रिगर किया है, तो परिणाम कभी विश्वसनीय नहीं रहे हैं, और छंटनी हमेशा उस तरह से नहीं निकली जिस तरह से आप उम्मीद करते थे।

पूरी तरह से तकनीकी स्पष्टीकरण के लिए क्वेरी ऑप्टिमाइज़र टीम द्वारा यह ब्लॉग पोस्ट देखें शीर्ष 100 प्रतिशत आज्ञाकारी हानिकारक माना जाता है।

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


3

दृश्य तालिकाओं की तरह व्यवहार करते हैं जिनकी सामग्री किसी क्वेरी के परिणामों द्वारा निर्धारित की जाती है।

तालिकाओं में आदेश नहीं है; वे सिर्फ पंक्तियों के बैग हैं।

इसलिए, विचारों के पास ऑर्डर नहीं है। आप उन्हें एक विशेष ORDER में पंक्तियों का चयन करके सॉर्ट कर सकते हैं, हालाँकि।


1
टेबल्स ... पंक्तियों की बस बैग - और फिर viwes बस रहे हैं आभासी के बैग आभासी पंक्तियाँ - दृश्य "मौजूद नहीं है" - जैसे वहाँ उनके लिए संग्रहीत कोई डेटा सब पर है - वे कर रहे हैं बस "करने के लिए एक प्रश्न की परिभाषा संग्रहीत अमल में लाना ", मूल रूप से।
marc_s

1
+1 टैब और विचारों की समानता मुझे मुख्य कारण लगता है कि क्यों विचारों में "ऑर्डर" नहीं होना चाहिए
चमत्कार 173

1
"दृश्य तालिकाओं की तरह व्यवहार करते हैं" । मैं कहूंगा कि "दृश्य बेस टेबल की तरह व्यवहार करते हैं। दृश्य टेबल हैं।"
ypercube y

-2

एक उत्तर जो अभी तक नहीं दिया गया है, वह यह है कि "ऑर्डर बाय" विधेय धक्का के साथ हस्तक्षेप कर सकता है जो प्रदर्शन को प्रभावित कर सकता है।

एक उदाहरण में एक दृश्य है जो डेटा के एक बड़े सेट को 10 लाइन सारांश में रोल करता है जो शीर्ष 10 / क्रमबद्ध है:

select * from TopOrderedView; -- Ordered 10 line summary in 5s

एक मजबूत विधेय के साथ एक ही मामले के लिए:

select * from TopOrderedView where <condition>; -- Ordered 2 line summary in still 5s

इसमें अभी भी उतना ही समय लगता है क्योंकि शीर्ष / आदेश द्वारा पाइप लाइन में पहले से चलाए जाने से विधेय को रोक दिया जाता है। इससे अनावश्यक पंक्तियों को संसाधित किया जा सकता है और यह योजना बिना किसी विधेय के समान होगी।

क्या आदेश से पहले धक्का होना चाहिए कि क्या वास्तव में एक डेवलपर विकल्प है और जवाब बदल सकता है। सबसे अधिक बार धक्का तार्किक इरादे है।

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

वास्तविक उपयोग के मामलों के लिए, एक अच्छा समझौता इंजन के लिए "खींचकर आदेश" करने के लिए होगा। यह एक "ऑर्डर" को दृश्य के भीतर निर्दिष्ट करने की अनुमति देगा (शीर्ष 100 प्रतिशत या कोई शीर्ष के साथ) और उस आदेश का उपयोग केवल तभी किया जाता है जब दृश्य सीधे से चुना जाता है, बिना किसी स्पष्ट आदेश के, कोई जोड़ नहीं, कोई समुच्चय नहीं, चैनिंग आदि देखें। ऊपर सूचीबद्ध दोनों मामले इस सरल मॉडल द्वारा समर्थित हो सकते हैं।


-6

आप एक दृश्य बना सकते हैं, जिसके द्वारा आदेश दिया गया है और जब आदेश दिया गया हो

..... आदेश द्वारा शीर्ष 99.999999999999 प्रतिशत का चयन करें


1
सिर्फ क्यों नहीं SELECT TOP 100 PERCENT ...?
मैक्स वर्नन

2
@ मोम शायद इस चाल के समान है - जो इसे एक अच्छा विचार नहीं बनाता है।
हारून बर्ट्रेंड

सहमत, @AaronBertrand - बस ध्यान देने की आवश्यकता नहीं है 99.99999999999 :-) का उपयोग करने के लिए
मैक्स वर्नोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.