2013-08-05 7 views
7

SQLite तालिका में 100,000 से अधिक पंक्तियां हैं या नहीं, यह जांचने का सबसे तेज़ तरीका क्या है?SQLite: यह जांचने का सबसे तेज़ तरीका है कि तालिका में x पंक्तियों से अधिक


परीक्षण तालिका में 26 कॉलम और 200,000,000 पंक्तियां हैं।

SELECT COUNT(*) FROM (SELECT * FROM table LIMIT 100001) 

0.27 सेकंड लिया।

निम्नलिखित तीन की जरूरत 12 और एक आधे मिनट

SELECT COUNT(*) FROM table 
SELECT COUNT(*) FROM table LIMIT 100001 
SELECT CASE WHEN COUNT(Id) >= 100000 THEN 1 ELSE 0 END FROM table 
+5

तालिका से गिनती (*) का चयन करें? –

+3

चयन * पंक्ति गणना प्राप्त करने के लिए एक अच्छा विचार नहीं है, अनुक्रमित फ़ील्ड का उपयोग करें। – ChrisBint

+3

@ क्रिसब्रिंट: आपको ** ** शून्य नहीं ** कॉलम (उदा। पीके) पर एक सूचकांक की आवश्यकता होगी न केवल "* कुछ अनुक्रमणिका *"। मुझे पता है कि अधिकांश डीबीएमएस स्वचालित रूप से 'count (*)' के लिए ऐसी अनुक्रमणिका का उपयोग करेंगे। क्या आपकी टिप्पणी का मतलब है कि SQLite वह स्मार्ट नहीं है? –

उत्तर

3
select count(*) from (
select top 100001 ID from T 
) x 

हमें क्वेरी का उत्तर देने के लिए एक अनुक्रमणिका स्कैन करने की आवश्यकता है। यह कम से कम 100001 पंक्तियों में इंडेक्स स्कैन को प्रतिबंधित करता है। यदि तालिका में 1 मीटर पंक्तियां हैं, तो यह काम का 9 0% बचाता है।

(यहां SQL सर्वर वाक्यविन्यास का उपयोग करना - कृपया स्वयं का अनुवाद करें क्योंकि मैं इसे नहीं कर सकता)।

आईडी के बजाय आप कुछ अनुक्रमित कॉलम चुन सकते हैं। मुझे नहीं पता कि अनुकूलक स्वयं ही ऐसा कर सकता है या नहीं।

नोट, पहचान या आईडी कॉलम मानों को देखने की तरह चालाक चाल सामान्य रूप से काम नहीं करती हैं।

उपर्युक्त क्वेरी का समर्थन करने के लिए, bit प्रकार का एक डमी कॉलम बनाएं और इसे अनुक्रमित करें। सूचकांक बहुत कॉम्पैक्ट और स्कैन करने के लिए सबसे तेज़ होगा।

0
SELECT COUNT (Column) FROM TABLE 

सुनिश्चित करना है कि स्तंभ का चयन किया अनुक्रमणित है, अधिमानतः एक INT।

+0

जैसा कि पहले से ही अन्य उत्तरों और टिप्पणियों में बताया गया था, 'कॉलम' को शून्य नहीं होना चाहिए। –

1
SELECT COUNT(indexed_column) FROM TableName 

अब अनुक्रमित स्तंभ हिस्सा महत्वपूर्ण बात है, तो आप * गिनती की तरह कुछ करने के लिए नहीं करना चाहते हैं, तो आप संभव एक सूचकांक कि प्रत्येक पंक्ति के लिए पर विद्यमान है का उपयोग करने के लिए मजबूर कर रहा एसक्यूएल के रूप में के रूप में विशिष्ट होना चाहते हैं वह टेबल

0
SELECT CASE WHEN COUNT(indexed_column) >= 100000 THEN 1 ELSE 0 END FROM table 

क्या ऐसा नहीं करना चाहिए? रिपोर्ट 1 यदि यह 100,000 से अधिक है और 0 अन्यथा

1

SELECT COUNT आपको बहुत सारी पंक्तियों के साथ काट देगा। यह काम करता है - लेकिन आप स्क्लाइट में सबसे तेज़ तरीका मांग रहे हैं।

उपयोग:

SELECT max(rowid) AS rowcount

NoLifeKing के रूप में बताया कि यह केवल ठीक से काम करता है, तो आप किसी भी विलोपन नहीं है। अन्यथा यह असंगत हो जाएगा और वास्तव में तालिका में एक उच्च पंक्ति गणना होगी।

नियमों के बारे में http://www.sqlite.org/autoinc.html देखें, स्क्लाइट कैसे पंक्तिबद्ध बनाता है।

+4

इसके साथ समस्या यह हो सकती है कि यह एक सारणी है जहां आप पंक्तियों को हटा दें। – NoLifeKing

+0

क्या होगा यदि मैं अपनी पंक्तियों को अवरोही आईडी द्वारा आदेशित तालिका में डालने का निर्णय लेता हूं? क्या होगा यदि पंक्ति की अधिकतम आईडी नकारात्मक है;) – DrCopyPaste

0
select count(*) from table  
select max(id) from table 

यदि तालिका प्राथमिक कुंजी आईडी, है दूसरा

+2

गिनती (*) अच्छी नहीं है (जैसा कि ऊपर वर्णित है ChrisBint) क्योंकि यह इंडेक्स को कुशलता से पर्याप्त रूप से उपयोग नहीं कर सकता है; अधिकतम (आईडी) अच्छा नहीं है, क्योंकि तालिकाओं को खंडित किया जा सकता है और आप उन सभी तालिकाओं के लिए नहीं मान सकते हैं जिन्हें उन्होंने – DrCopyPaste

1

पर आप किसी भी अनुक्रमित स्तंभ नहीं है, तो, मुझे लगता है कि सबसे तेज़ तरीका होगा

select 1 from test1 limit 1 offset 100000; 

(एन = 100000 के लिए) ऐसा इसलिए है क्योंकि आपको केवल एन + 1 पंक्तियां मिलेंगी। कोई गिनती नहीं, अधिकतम नहीं।

आप इसे यहां sqlfiddle

+0

बढ़ाया है, सभी पंक्तियों को वापस करने से उन्हें इंजन में गिनने से बहुत धीमा होगा। बहुत धीमा – usr

+1

मेरे पास SQLite installe नहीं है, लेकिन sqlfiddle (SQLite.js) दिखाता है कि ऑफसेट गिनती से बहुत तेज है। मैं SQLite विशेषज्ञ का कोई रास्ता नहीं हूं, यह बहुत अच्छा होगा अगर कोई तालिका पर परीक्षण करता है तो एन से अधिक गिनती है। मैं इसे बाद में कर सकता हूं अगर कोई भी –

+1

नहीं देख रहा था कि मैं देख रहा था कि आप सभी पंक्तियों को वापस नहीं कर रहे हैं, सिर्फ गिनती। उस स्थिति में आपका जवाब अच्छा है क्योंकि हमारे पास एक ही विचार था :) – usr

0
select count(*) from table 

कोशिश कर सकते हैं - क्वेरी अनुकूलक अपने अनुक्रमित स्तंभ चुनता है।

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

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