2010-12-17 19 views
11

मैंने हमेशा "एक्स से COUNT (1) चुनें" लेकिन शायद यह सबसे कुशल नहीं है। कोई विचार? अन्य विकल्पों में SELECT COUNT (*) या शायद अंतिम डाली गई आईडी प्राप्त हो रही है यदि यह स्वत: वृद्धि हुई है (और कभी नहीं हटाई गई)।SQLite में किसी तालिका में पंक्तियों को गिनने का सबसे प्रभावी तरीका क्या है?

अगर मैं सिर्फ यह जानना चाहता हूं कि टेबल में कुछ भी है या नहीं? (जैसे, गिनती> 0?)

+0

गिनती (*) गणना (कुछ) बनाम के लिए, एक नज़र (यहाँ) [http://stackoverflow.com/questions/4437399/is-using-count-or-select-a-good-idea/ है 4439459 # 4439459] – Ronnis

उत्तर

11

सबसे अच्छा तरीका है सुनिश्चित करें कि आप एक एकल स्तंभ पर SELECT COUNT चलाने बनाने के लिए है (SELECT COUNT(*) धीमी है) - लेकिन SELECT COUNT हमेशा सबसे तेज़ तरीका है (डेटाबेस चीजों की गिनती प्राप्त करने के लिए किया जाएगा आंतरिक रूप से क्वेरी को अनुकूलित करता है)।

यदि आप नीचे दी गई टिप्पणियों की जांच करते हैं, तो आप SELECT COUNT(1) के लिए तर्क क्यों देख सकते हैं कि शायद आपका सबसे अच्छा विकल्प है।

+0

यदि आप तालिका पर अनुक्रमित कॉलम पर गिनती (कॉलमनाम) का चयन करते हैं तो यह बेहतर होता है। – DwB

+0

तो COUNT (1) चुनें लेकिन COUNT (आईडी) चुनें? – tofutim

+0

हाँ - जैसे dwb ने कहा, अनुक्रमित एक कॉलम पर इसे करने के लिए सबसे अच्छा है। – girasquid

0

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

0

पंक्ति गणना प्राप्त करने का सबसे तेज़ तरीका सीधे तालिका मेटाडेटा से है, यदि कोई हो। दुर्भाग्यवश, मुझे SQLite में उपलब्ध इस तरह के डेटा के लिए संदर्भ नहीं मिल रहा है।

उसमें असफल होने पर प्रकार

COUNT का चयन करें (गैर शून्य निरंतर मूल्य) तालिका

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

जैसे ही आप SELECT COUNT में एक कॉलम पेश करते हैं, आप इंजन को कम से कम एक इंडेक्स स्कैन करने और संभवतः एक टेबल स्कैन करने के लिए कह रहे हैं, और यह धीमा हो जाएगा।

-1

sp_spaceused 'table_name' (एकल उद्धरण को बाहर)

इस उपरोक्त तालिका में पंक्तियों की संख्या वापस आ जाएगी, यह सबसे कारगर तरीका मैं भर में अभी तक आ गए हैं।

यह (एकल उद्धरण को बाहर)

sp_spaceused किसी भी तालिका के लिए इस्तेमाल किया जा सकता select Count(1) from 'table_name' तुलना में अधिक कुशल है, यह बहुत उपयोगी है जब तालिका असाधारण बड़ा (पंक्तियों के लाखों लोगों के सैकड़ों) है, एक तरह से पंक्तियों की संख्या देता है सही , जबकि 'select Count(1)' में 10 सेकंड से अधिक समय लग सकता है। इसके अलावा, इसे विचार करने के लिए किसी कॉलम नाम/कुंजी फ़ील्ड की आवश्यकता नहीं है।

+0

प्रश्न SQLite के बारे में है, SQL सर्वर – dsz

1

आपको कॉल करके ROWID अनुकूलन के बिना आप पंक्तियों की संख्या में हो सकता है यकीन है कि (वास्तव में यकीन है कि) आप उस तालिका से किसी भी पंक्ति को नष्ट कर दिया कभी नहीं किया है और अपने टेबल के साथ निर्धारित नहीं किया गया हैं:

select max(RowId) from table; 

या अगर अपनी मेज एक परिपत्र कतार आप की तरह

select MaxRowId - MinRowId + 1 from 
    (select max(RowId) as MaxRowId from table) JOIN 
    (select min(RowId) as MinRowId from table); 

कुछ इस्तेमाल कर सकते हैं यह वास्तव में बहुत तेजी से (मिलीसेकेंड) है है, लेकिन आप ध्यान देना चाहिए, क्योंकि SQLite का कहना है कि पंक्ति आईडी ही में सभी पंक्तियों के बीच अद्वितीय है तालिका। SQLite यह घोषणा नहीं करता है कि पंक्ति आईडी हैं और हमेशा लगातार संख्याएं होंगी।

+0

नहीं, यहां आप पंक्तिबद्ध [लिंक] पर निर्भर होने के बारे में कुछ पढ़ सकते हैं (http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something- आप-सच-जरूरत जानने-की-/) – Teolazza

0

girasquid के जवाब पर नजर रखने के लिए, डेटा बिंदु के रूप में, मैं 23 लाख पंक्तियों के साथ एक SQLite तालिका है। select count(*) from table का उपयोग करके, पंक्तियों की गणना करने में 3 सेकंड से अधिक समय लगे। मैंने SELECT rowid FROM table का उपयोग करने का भी प्रयास किया, (यह सोचकर कि पंक्तिबद्ध एक डिफ़ॉल्ट प्राथमिक अनुक्रमित कुंजी है) लेकिन यह कोई तेज़ नहीं था। फिर मैंने डेटाबेस में किसी एक फ़ील्ड पर एक इंडेक्स बनाया (केवल एक मनमाना क्षेत्र, लेकिन मैंने एक पूर्णांक फ़ील्ड चुना क्योंकि मुझे पिछले अनुभव से पता था कि छोटे क्षेत्रों पर इंडेक्स बहुत तेज़ हो सकते हैं, मुझे लगता है क्योंकि इंडेक्स एक प्रतिलिपि संग्रहीत है इंडेक्स में मूल्य का ही)। SELECT my_short_field FROM table ने समय को एक सेकंड से भी कम समय तक लाया।

संबंधित मुद्दे

 संबंधित मुद्दे