दिलचस्प पोस्ट
विंडोज फोन में ऐप वर्जन कैसे प्राप्त करें? 'सीओएटी' एक प्रकार का नाम नहीं है बड़ी एसक्यूएल फ़ाइल आयात करते समय MySQL सर्वर दूर हो गया है Jquery का उपयोग कर एक छवि का रंग कैसे बदल सकता है ViewPager पेजर एडाप्टर दृश्य को अपडेट नहीं कर रहा है YUV-> आरजीबी (छवि प्रोसेसिंग) -> YVV को प्रिव्यूफ़्रेम में एंड्रॉइड के दौरान परिवर्तित करना है? एंड्रॉइड-जावा- ऑब्जेक्ट के भीतर किसी निश्चित मान से ऑब्जेक्ट्स की एक सूची को सॉर्ट करने के लिए परीक्षण SMTP सर्वर C # के माध्यम से चल रहा है एंड्रॉइड – कोऑर्डिनेटर लेआउट में उपयोग किए जाने पर स्क्रीन पर पाद लेख स्क्रॉल किया जाता है जावास्क्रिप्ट में = = _ मतलब क्या है मैं रनटाइम पर WinForms एप्लिकेशन की संस्कृति को कैसे बदलूं? मैं आईओएस पर बारकोड कैसे स्कैन कर सकता हूं? सेवा बनाम फैक्टरी के बारे में उलझनें स्टाइल सेटर में ब्लेंड व्यवहार कैसे जोड़ें स्प्रिंग में जेपीए / सीतनिद्रा में, मैं आलसी प्रारंभिक अपवादों से बचने के लिए एक सत्र कैसे खोल सकता हूं?

PostgreSQL में किसी तालिका की पंक्ति संख्या को खोजने के लिए तेज़ तरीका

प्रतिशत की गणना करने के लिए मुझे तालिका में पंक्तियों की संख्या जानना चाहिए I यदि कुल गिनती कुछ पूर्वनिर्धारित स्थिरांक से अधिक है, तो मैं निरंतर मान का उपयोग करूँगा। अन्यथा, मैं पंक्तियों की वास्तविक संख्या का उपयोग करूँगा

मैं SELECT count(*) FROM table उपयोग कर सकता हूँ लेकिन अगर मेरा निरंतर मूल्य 500,000 है और मेरी तालिका में 5,000,000,000 पंक्तियाँ हैं, तो सभी पंक्तियों की गिनती में बहुत समय बर्बाद होगा

जैसे ही मेरा निरंतर मूल्य पार किया जाता है, क्या गिनती करना संभव है?

मुझे केवल पंक्तियों की सही संख्या की आवश्यकता है जब तक कि यह दी गई सीमा से कम हो। अन्यथा, अगर गिनती सीमा से अधिक है, तो मैं इसके बजाय सीमा मूल्य का उपयोग करता हूं और जितना जल्दी हो सके उतना जवाब देना चाहता हूं।

कुछ इस तरह:

 SELECT text,count(*), percentual_calculus() FROM token GROUP BY text ORDER BY count DESC; 

Solutions Collecting From Web of "PostgreSQL में किसी तालिका की पंक्ति संख्या को खोजने के लिए तेज़ तरीका"

बड़ी तालिकाओं में पंक्तियों की गिनती पोस्टग्रेएसक्यूएल में धीमी गति से ज्ञात है एक सटीक संख्या प्राप्त करने के लिए उसे एमवीसीसी की प्रकृति के कारण पंक्तियों की एक पूरी संख्या करना पड़ता है। अगर आपके मामले में ऐसा लगता है कि ऐसा गिनती सटीक नहीं है तो नाटकीय ढंग से इसे गति देने का एक तरीका है।

सटीक गणना (बड़े तालिकाओं से धीमा ) प्राप्त करने के बजाय:

 SELECT count(*) AS exact_count FROM myschema.mytable; 

आप इस तरह एक करीबी अनुमान प्राप्त करें ( बहुत तेज ):

 SELECT reltuples::bigint AS estimate FROM pg_class where relname='mytable'; 

अनुमान कितना करीब है, इस पर निर्भर करता है कि क्या आप पर्याप्त ANALYZE हैं। यह आमतौर पर बहुत करीब है।
PostgreSQL विकी FAQ देखें।
या गिनती (*) प्रदर्शन के लिए समर्पित विकी पृष्ठ

और भी बेहतर

पोस्टग्रेएसक्यूएल विकी में आलेख थोड़ा सा ढलान था । यह संभावना को नजरअंदाज कर दिया था कि एक डेटाबेस में एक ही नाम के एक से अधिक सारणी हो सकती हैं – अलग-अलग स्कीमा में उस खाते के लिए:

 SELECT c.reltuples::bigint AS estimate FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = 'mytable' AND n.nspname = 'myschema' 

या बेहतर अभी भी

 SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'myschema.mytable'::regclass; 

तेज़, सरल, सुरक्षित, अधिक सुरुचिपूर्ण ऑब्जेक्ट पहचानकर्ता प्रकारों पर मैन्युअल देखें।

अमान्य तालिका नामों के अपवादों से बचने के लिए Postgres 9.4+ में to_regclass('myschema.mytable') उपयोग करें:

  • किसी तालिका में मौजूद स्कीमा में जांच कैसे करें

TABLESAMPLE SYSTEM (n) पोस्टग्रेस 9.5+ में

 SELECT 100 * count(*) AS estimate FROM mytable TABLESAMPLE SYSTEM (1); 

@ ए_ हॉर्स की तरह टिप्पणी की गई , SELECT कमांड के नये जोड़े गए खंड उपयोगी हो सकते हैं यदि किसी कारण से pg_class में आंकड़े पर्याप्त रूप से चालू नहीं हैं। उदाहरण के लिए:

  • कोई autovacuum रनिंग नहीं है
  • एक बड़ी INSERT या DELETE तुरंत बाद
  • TEMPORARY तालिकाओं (जो कि autovacuum द्वारा कवर नहीं किए गए हैं)

यह केवल यादृच्छिक n % (उदाहरण में 1 ) को देखता है और इसमें पंक्तियों की गणना करता है एक बड़ा नमूना लागत को बढ़ाता है और त्रुटि को कम कर देता है, आपकी पसंद सटीकता अधिक कारकों पर निर्भर करती है:

  • पंक्ति के आकार का वितरण अगर किसी दिए गए ब्लॉक को सामान्य पंक्तियों की तुलना में व्यापक रखने के लिए होता है, तो गणना सामान्य से कम है।
  • मृत ट्यूपल्स या एक FILLFACTOR प्रति स्थान पर कब्जा कर लेते हैं। तालिका में असमान रूप से वितरित होने पर, अनुमान बंद हो सकता है।
  • सामान्य गोल त्रुटियाँ

ज्यादातर मामलों में pg_class से अनुमान तेजी से और अधिक सटीक होगा।

वास्तविक प्रश्न का उत्तर दें

सबसे पहले, मुझे उस तालिका में पंक्तियों की संख्या जानना होगा, यदि कुल गिनती कुछ पूर्वनिर्धारित स्थिरांक से अधिक है,

और क्या यह …

… इस समय गिनती मेरे निरंतर मूल्य से गुजरती है, यह गिनती को रोक देगा (और पंक्ति संख्या को सूचित करने के लिए गिनती खत्म करने के लिए इंतजार नहीं करना अधिक है)।

हाँ। आप LIMIT साथ एक subquery का उपयोग कर सकते हैं:

 SELECT count(*) FROM (SELECT 1 FROM token LIMIT 500000) t; 

पोस्टग्रेस वास्तव में दी गई सीमा से अधिक गिनती रोकता है, आपको एन पंक्तियों (उदाहरण के तौर पर 500000) के लिए एक सटीक और वर्तमान गिनती मिलती है, और अन्यथा नहीं। हालांकि, pg_class में अनुमान के pg_class उतना तेज नहीं है।

मैं इसे एक पोस्टग्रे ऐप में चलाकर एक बार किया था:

 EXPLAIN SELECT * FROM foo; 

फिर एक regex, या समान तर्क के साथ आउटपुट की जांच। सरल चयन * के लिए, आउटपुट की पहली पंक्ति कुछ इस तरह दिखनी चाहिए:

 Seq Scan on uids (cost=0.00..1.21 rows=8 width=75) 

आप rows=(\d+) मान को उन पंक्तियों की संख्या का मोटा अनुमान के रूप में उपयोग कर सकते हैं जो लौटा दिए जाएंगे, तो केवल वास्तविक SELECT COUNT(*) का अनुमान करें यदि अनुमान है, तो 1.5x से कम आपके थ्रेसहोल्ड (या जो भी नंबर आपको लगता है वह आपके आवेदन के लिए समझ में आता है)।

आपकी क्वेरी की जटिलता के आधार पर, यह संख्या कम और कम सटीक हो सकती है। वास्तव में, मेरे आवेदन में, जैसा हमने जोड़ा और जटिल परिस्थितियों में जोड़ा, यह इतना गलत हो गया कि यह पूरी तरह बेकार था, यह जानने के लिए भी कि 100 की कितनी पंक्तियों को हमने वापस कर दिया है, की शक्ति के भीतर, इसलिए हमें उस रणनीति को छोड़ना पड़ा।

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

ओरेकल में, आप लौटे हुए पंक्तियों की संख्या को सीमित करने के लिए rownum का इस्तेमाल कर सकते हैं मैं अनुमान लगा रहा हूं कि दूसरे एसक्यूएल में भी समान निर्माण मौजूद है। इसलिए, उदाहरण के लिए आपने दिया था, आप 500001 में लौटाए गए पंक्तियों की संख्या को सीमित कर सकते हैं और फिर एक count(*) लागू कर सकते हैं:

 SELECT (case when cnt > 500000 then 500000 else cnt end) myCnt FROM (SELECT count(*) cnt FROM table WHERE rownum<=500001) 

टेक्स्ट कॉलम कितना विस्तृत है?

एक समूह के साथ आप डेटा स्कैन (कम से कम एक सूचकांक स्कैन) से बचने के लिए बहुत कुछ नहीं कर सकते।

मैं सुझाऊंगा:

  1. यदि संभव हो तो, पाठ डेटा के दोहराव को हटाने के लिए स्कीमा बदल रहा है। इस तरह से गिनती 'कई' तालिका में एक संकीर्ण विदेशी कुंजी क्षेत्र पर होगी।

  2. वैकल्पिक रूप से, पाठ के हश के साथ एक जनरेट किया गया कॉलम बना रहा है, फिर हैश कॉलम द्वारा ग्रुप बी। फिर से, यह वर्कलोड (एक संकीर्ण स्तंभ सूचकांक के माध्यम से स्कैन) को कम करना है

संपादित करें:

आपका मूल प्रश्न आपके संपादन का काफी मेल नहीं खाता था। मुझे यकीन नहीं है कि अगर आप जानते हैं कि COUNT, जब किसी ग्रुप द्वारा उपयोग किया जाता है, प्रति समूह वस्तुओं की गिनती लौटाएगा और पूरी तालिका में वस्तुओं की गिनती नहीं देगा।

एसक्यूएल सर्वर (2005 या उससे ऊपर) के लिए एक त्वरित और विश्वसनीय तरीका है:

 SELECT SUM (row_count) FROM sys.dm_db_partition_stats WHERE object_id=OBJECT_ID('MyTableName') AND (index_id=0 or index_id=1); 

MSDN में sys.dm_db_partition_stats के बारे में विवरण समझाया गया है

क्वेरी एक (संभावित) विभाजन तालिका के सभी हिस्सों से पंक्तियों को जोड़ती है।

index_id = 0 एक अनारॉर्डेड टेबल (हीप) है और इंडेक्स_आईडी = 1 ऑर्डर किए गए टेबल (क्लस्टर इंडेक्स) है

यहां तक ​​कि तेज (लेकिन अविश्वसनीय) तरीकों का विस्तृत विवरण यहां दिया गया है।

इस ब्लॉग से लिया गया संदर्भ

आप नीचे पंक्ति का पता लगाने के लिए क्वेरी का उपयोग कर सकते हैं।

Pg_class का उपयोग करना:

  SELECT reltuples::bigint AS EstimatedCount FROM pg_class WHERE oid = 'public.TableName'::regclass; 

Pg_stat_user_tables का उपयोग करना:

 SELECT schemaname ,relname ,n_live_tup AS EstimatedCount FROM pg_stat_user_tables ORDER BY n_live_tup DESC;