एक उपश्रेणी में ORDER BY का डेटाबेस कार्यान्वयन


10

मैं एक एप्लिकेशन (MapServer - http://mapserver.org/ ) का उपयोग कर रहा हूं जो SQL स्टेटमेंट को लपेटता है, ताकि ORDER BY स्टेटमेंट इनर क्वेरी में हो। उदाहरण के लिए

SELECT * FROM (
        SELECT ID, GEOM, Name
        FROM t
        ORDER BY Name
        ) as tbl

एप्लिकेशन में कई अलग-अलग डेटाबेस ड्राइवर हैं। मैं मुख्य रूप से MS SQL Server ड्राइवर, और SQL Server 2008 का उपयोग करता हूं। यदि कोई ORDER BY किसी उपकुंजी में पाया जाता है, तो यह एक त्रुटि फेंकता है।

MS डॉक्स से (हालाँकि यह SQL Server 2000 के लिए है, यह अभी भी लागू होता है):

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

हालाँकि पोस्टग्रेज़ (9) और ओरेकल रिटर्न परिणाम में चलने पर उसी प्रकार की क्वेरी - आदेश के रूप में उपकुंजी में परिभाषित की गई है। पोस्टग्रैज में क्वेरी प्लान दिखाता है कि परिणाम छाँटे गए हैं और पोस्टग्रिज़ जारी नोटों में वे आइटम शामिल हैं जो उप-क्रम के आदेशों को दर्शाते हैं:

ऊपरी क्वेरी से मेल खाता होने पर उप-क्रम आदेश से बचें

http://en.wikipedia.org/wiki/Oder_by राज्यों:

हालाँकि कुछ डेटाबेस सिस्टम सबडर्सेल्स में एक ORDER BY क्लॉज़ के विनिर्देशन की अनुमति देते हैं या परिभाषाएँ देखते हैं, वहाँ मौजूदगी का कोई प्रभाव नहीं पड़ता है।

हालाँकि मेरी खुद की क्वेरी योजनाओं की जाँच से:

  • SQL Server 2008 किसी उप-क्रम में ORDER BY का समर्थन नहीं करता है
  • पोस्टग्रैज 9 एक उप-कक्ष में ORDER BY का समर्थन करता है
  • ओरेकल 10 जी एक उपक्वरी में ORDER BY का समर्थन करता है

तो मेरा सवाल यह है कि क्या कोई लिंक है जो आधिकारिक तौर पर पुष्टि कर सकता है या इनकार कर सकता है कि पोस्टग्रैस और ओरेकल एक उप-वर्ग में छंटनी की अनुमति नहीं देते हैं?


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

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

2
@geographika भले ही कुछ डीबीएमएस अब तक लगातार करते हैं, लेकिन कोई गारंटी नहीं है कि वे भविष्य में भी ऐसा ही करते रहेंगे। एक उदाहरण के रूप में, MySQL के 5.6 (और MariaDB 5.3) में ऑप्टिमाइज़र के सुधार ORDER BYउपकेंद्र में अनावश्यक के रूप में पहचान करेंगे और अनावश्यक छंटाई नहीं करेंगे।
ypercube y

जवाबों:


15

आप अपना आवेदन उपकुरी के अंदर नहीं डालने के लिए जा रहे हैं ORDER BY(हो सकता है कि इसमें पहले स्थान पर एक बेकार उपकुंजी का उपयोग न करने का विकल्प हो)। जैसा कि आप पहले ही खोज चुके हैं, यह वाक्यविन्यास SQL ​​सर्वर में बिना समर्थित नहीं है TOP। और TOPजब तक आप कुछ पंक्तियों को बाहर नहीं छोड़ना चाहते, तब तक किसी भी तरह TOP 100 PERCENTसे ORDER BYअनुकूलित को रेंडर करना है।

और Oracle और PostGres में, सिंटैक्स का समर्थन करने के कारण , इसका मतलब यह नहीं है कि इसका पालन किया जाता है। और सिर्फ इसलिए कि आप इसे किसी न किसी परिदृश्य में पालन किए जाने के रूप में देखते हैं, इसका मतलब यह नहीं है कि इसे जारी रखा जाएगा क्योंकि नए संस्करण आपके डेटा, आंकड़ों, क्वेरी या स्वयं के वातावरण में सूक्ष्म परिवर्तन के साथ आते हैं।

मैं आपको आश्वस्त कर सकता हूं कि, बिना किसी संदेह के , यदि आप ऑर्डर के बारे में गारंटी चाहते हैं, तो आपको ORDER BYसबसे बाहरी क्वेरी पर रखना होगा । यह एक ऐसा सिद्धांत होना चाहिए जो आपके पास कोई भी बात नहीं है कि आप किस मंच का उपयोग कर रहे हैं।

आप एक लिंक के लिए पूछ रहे हैं जो आधिकारिक तौर पर बताता है कि कुछ समर्थित नहीं है। यह एक आधिकारिक बयान के लिए आपकी कार के मालिक के मैनुअल में देखने जैसा है कि आपकी कार उड़ नहीं सकती है।


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

-1

मैं मानता हूं कि यह बहुत आसान है, लेकिन अगर आप एक चुटकी में हैं तो उपनगर में पंक्तियों की शीर्ष संख्या वापस करने का प्रयास करें। शीर्ष 100 प्रतिशत लौटना काम नहीं करता है, लेकिन यदि आप मुसीबत से गुजरना चाहते हैं तो आप पंक्तियों की संख्या को क्वेरी कर सकते हैं और उसको TOP के रूप में पास कर सकते हैं। मैंने इसे 80 के कॉम्पिटिशन लेवल पर सेट किए गए डेटाबेस पर टेस्ट किया, इसलिए मुझे लगता है कि इसे SQL 2000 के साथ काम करना चाहिए।

SELECT * FROM (
        SELECT TOP (100000) ID, GEOM, Name
        FROM t
        ORDER BY Name
        ) as tbl

मैं मूल रूप से यह कोशिश की थी और यह छोटे डेटासेट के लिए ठीक तरह से लग रहा था। हालाँकि जब मुझे बहुत बड़े रिकॉर्डसेट मिल रहे थे तब SQL Server 2008R2 में छँटाई फिर से यादृच्छिक हो गई। शायद स्मृति / पृष्ठ आकार से संबंधित है?
जियोग्राफिका

क्षमा करें, यह मदद नहीं की। शीर्ष 100 प्रतिशत का चयन करने से छंटनी का कारण यादृच्छिकता भी हो सकती है।
DBNull

यदि क्वेरी समानांतर चलती है, तो यह काम नहीं करेगा, खासकर यदि Nameगैर-अद्वितीय है। यह क्रमिक रूप से काम करना जारी नहीं रख सकता है यदि ऑप्टिमाइज़र अलग-अलग इंडेक्स चुनता है, अलग-अलग कुंजी कॉलम ऑर्डर के साथ।
एरिक डार्लिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.