न्यूनतम / अधिकतम बनाम आदेश और सीमा


100

निम्नलिखित प्रश्नों में से, आप किस विधि को बेहतर मानेंगे? आपके कारण क्या हैं (कोड दक्षता, बेहतर रख-रखाव, कम WTFery) ...

SELECT MIN(`field`)
FROM `tbl`;

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;

जवाबों:


126

सबसे खराब स्थिति में, जहाँ आप एक अनएन्डेक्सिडेट फ़ील्ड को देख रहे हैं, उपयोग MIN()करने के लिए तालिका के एकल पूर्ण पास की आवश्यकता होती है। का उपयोग कर SORTऔर LIMITएक फ़ाइल की आवश्यकता है। यदि एक बड़ी तालिका के खिलाफ चलाया जाता है, तो संभावित रूप से प्रदर्शन के प्रदर्शन में महत्वपूर्ण अंतर होगा। एक अर्थहीन डेटा बिंदु के रूप में, मेरे देव सर्वर पर 106,000 पंक्ति तालिका के विरुद्ध MIN().36 के समय SORTऔर LIMIT.84 के बीच लिया गया।

यदि, हालांकि, आप एक अनुक्रमित कॉलम देख रहे हैं, तो अंतर नोटिस करना मुश्किल है (अर्थहीन डेटा बिंदु दोनों मामलों में 0.00s है)। हालांकि, स्पष्टीकरण के आउटपुट को देखते हुए, ऐसा लगता MIN()है कि सूचकांक से केवल सबसे छोटे मूल्य को प्लक करने में सक्षम है ('दूर से अनुकूलित तालिकाओं का चयन करें' और 'NULL' पंक्तियों) जबकि SORTऔर LIMITअभी भी सूचकांक के एक आदेशित traversal करने की जरूरत है (106,000 पंक्तियाँ)। वास्तविक प्रदर्शन प्रभाव शायद नगण्य है।

ऐसा लगता MIN()है कि जाने का तरीका है - यह सबसे खराब स्थिति में तेज है, सबसे अच्छा मामले में अविवेच्य है, मानक एसक्यूएल है और सबसे स्पष्ट रूप से उस मूल्य को व्यक्त करता है जिसे आप प्राप्त करने की कोशिश कर रहे हैं। एकमात्र मामला जहां ऐसा लगता है कि उपयोग करना SORTऔर LIMITवांछनीय होगा, जैसा कि उल्लेख किया गया है, जहां आप एक सामान्य ऑपरेशन लिख रहे हैं, जो मनमाने कॉलम से शीर्ष या नीचे एन मान पाता है और यह विशेष-केस ऑपरेशन को लिखने के लायक नहीं है।


7
ओ (एन) सॉर्टिंग के लिए एक सिंगल पास बनाम 0 (nlogn) के लिए
अभिषेक अय्यर

1
@AbhishekIyer आप पूरी तरह से सही हैं, लेकिन मैं "अनइंडेक्स फ़ील्ड के लिए सबसे खराब स्थिति में" जोड़ूंगा।
dikikam

सबसे बुरी तरह से अनएन्डेक्सिड केस के बारे में यह हिस्सा गलत है। आपको हमेशा एक पूर्ण स्कैन की आवश्यकता होती है, और आप कैसे जानते हैं कि यह न्यूनतम या अधिकतम है? यह ऐसा नहीं है कि आप स्कैन कर रहे हैं और मूल्य चिल्लाता है: "अरे, आपने आखिरकार मुझे पाया! मैं जैक हूं, अधिकतम!"।
रोबो रोबोक

470 मिलियन पंक्तियों के साथ एक अनुक्रमित तालिका के साथ एक परीक्षण में, दोनों प्रश्न 0.00 s लेते हैं। हालाँकि, यदि हम क्वेरीज़ को "WHERE फ़ील्ड 2 = x" से जोड़ते हैं, तो LIMIT के साथ क्वेरी अभी भी 0.00 s लेती है और MIN के साथ क्वेरी 0.21 s लेती है।
एंटोनियो कानास वर्गास

12
SELECT MIN(`field`)
FROM `tbl`;

केवल इसलिए कि यह एएनएसआई संगत है। सीमा 1 MySql के लिए विशेष रूप से है क्योंकि TOP SQL सर्वर के लिए है।


अधिकांश DBMSes की सीमा / ऑफसेट या समतुल्य है, और यह उन ऐप्स के बहुमत में उपयोग किया जाता है, जिन पर मैंने काम किया है (MIN के विकल्प के रूप में नहीं, लेकिन पृष्ठांकन जैसे अन्य उद्देश्यों के लिए।)
finnw

@finnw - मैं सहमत हूं, लेकिन प्रश्नकर्ता का उदाहरण स्पष्ट रूप से न्यूनतम के साथ सीमा की तुलना कर रहा था।
ओटवियो डेसिओ

9

जैसा कि मेसन और सीन मैकोसमेलिंग ने बताया है, MIN बेहतर है।

एक अन्य कारण जहां ORDER BY + LIMIT उपयोगी है, यदि आप MIN कॉलम से भिन्न स्तंभ का मान प्राप्त करना चाहते हैं।

उदाहरण:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

4

मुझे लगता है कि उत्तर इस बात पर निर्भर करता है कि आप क्या कर रहे हैं।

यदि आपके पास 1 बंद क्वेरी है और आपके द्वारा निर्दिष्ट के रूप में आशय उतना ही सरल है, तो चयन करें मिनट (फ़ील्ड) बेहतर है।

हालाँकि, इस प्रकार की आवश्यकताओं में परिवर्तन होना आम बात है - शीर्ष n परिणाम, हड़प nth - mth परिणाम, आदि।

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

अब अपने आप को सीमित क्यों करें, दर्द के लिए आप बाद में महसूस कर सकते हैं या नहीं कर सकते हैं?

मुझे लगता है कि एएनएसआई जितना संभव हो उतना अच्छा है, लेकिन यह सिर्फ एक दिशानिर्देश है ...


3

स्वीकार्य प्रदर्शन को देखते हुए मैं पहले का उपयोग करूंगा क्योंकि यह आशय के करीब है।
यदि प्रदर्शन एक मुद्दा था, (अधिकांश आधुनिक ऑप्टिमाइज़र एक ही क्वेरी योजना के लिए दोनों को प्रबल रूप से अनुकूलित करेंगे, हालांकि आपको यह सत्यापित करने के लिए परीक्षण करना होगा) तो निश्चित रूप से मैं तेज़ का उपयोग करूंगा।

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