Sqlite सीमा / ऑफ़लाइन प्रश्न


153

सकलाइट के साथ मेरा सरल प्रश्न है। इसमें क्या अंतर है:

Select * from Animals LIMIT 100 OFFSET 50

तथा

Select * from Animals LIMIT 100,50

9
कृपया इसे उत्तर के रूप में चिह्नित करें यदि यह आपकी शंकाओं को दूर कर चुका है जैसा कि आपने टिप्पणियों में उल्लेख किया है।
मुबाशर

जवाबों:


270

दो सिंटैक्स फॉर्म थोड़ा भ्रमित करने वाले होते हैं क्योंकि वे संख्याओं को उल्टा करते हैं:

LIMIT <skip>, <count>

के बराबर है:

LIMIT <count> OFFSET <skip>

यह MySQL और PostgreSQL के सिंटैक्स के साथ संगत है। MySQL सिंटैक्स दोनों रूपों का समर्थन करता है, और इसके डॉक्स का दावा है कि OFFSET के साथ दूसरा सिंटैक्स PostgreSQL के साथ संगतता प्रदान करने के लिए था। PostgreSQL डॉक्स यह केवल दूसरे सिंटैक्स का समर्थन करता है, और SQLite के डॉक्स दिखाता है कि यह दोनों का समर्थन करता है, भ्रम से बचने के लिए दूसरे सिंटैक्स की सिफारिश करता है।

वैसे, पहले ORDER BY का उपयोग किए बिना LIMIT का उपयोग करना हमेशा आपके द्वारा दिए गए परिणामों को नहीं दे सकता है। व्यवहार में, SQLite कुछ क्रम में पंक्तियों को वापस कर देगा, शायद यह निर्धारित करके कि वे भौतिक रूप से फ़ाइल में कैसे संग्रहीत हैं। लेकिन इसका मतलब यह नहीं है कि यह आपके इच्छित क्रम में है। एक पूर्वानुमेय आदेश प्राप्त करने का एकमात्र तरीका स्पष्ट रूप से आदेश का उपयोग करना है।


2
LIMIT <count> OFFSET <skip>अधिक स्पष्ट है। धन्यवाद।
गुइडो मोचा

यदि पंक्तियों का क्रम मायने रखता है तो इसी तरह के उत्तर में अच्छे प्रदर्शन के साथ एक अच्छा समाधान है। stackoverflow.com/a/28860492/5016333
रोड्रिगो वी

23

उत्तरार्द्ध एक चेतावनी के साथ एक वैकल्पिक वाक्यविन्यास है :

यदि OFFSET कीवर्ड के बजाय अल्पविराम का उपयोग किया जाता है, तो ऑफसेट पहली संख्या है और सीमा दूसरी संख्या है। यह प्रतीत होता है कि विरोधाभास जानबूझकर है - यह विरासत SQL डेटाबेस सिस्टम के साथ संगतता को अधिकतम करता है।


5

मैंने कुछ परीक्षण किए और प्रदर्शन में कोई अंतर नहीं है।

यह केवल अन्य sql भाषाओं के साथ संगतता के लिए है।

दोनों संस्करणों का रनिंग टाइम एक ही है।

मैंने 100000 पंक्तियों के साथ तालिका 1 के साथ साइक्लाइट डीबी बनाया। मैं अगला परीक्षण चलाता हूं

long timeLimitOffset = 0;
long timeLimitComma = 0;
for (int i = 0; i < 100000; i++)
{
   //first version
   timeLimitOffset += SqlDuraction("Select * from table1  order by col1 LIMIT " + (i + 1) + " OFFSET " + (1001 - i) + "");
   // second version
   timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT " + (1001 - i) + " , " + (i + 1) + "");
}

टाइम्स एक सेकंड के 0.001 के लिए भिन्न होता है


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