2015-05-19 6 views
7

मुझे एक कॉलम प्राथमिक कुंजी के साथ एक साधारण तालिका मिली है जिसे आईडी कहा जाता है, serial टाइप करें। वहां वास्तव में 100,000,000 पंक्तियां हैं। तालिका 48 जीबी, पीके सूचकांक सीए 2,1 जीबी लेता है। मशीन चलाना केवल पोस्टग्रेज़ के लिए "समर्पित" है और यह कोर i5, 500GB HDD, 8GB RAM की तरह कुछ है। पीजी कॉन्फ़िगरेशन pgtune उपयोगिता द्वारा साझा किया गया था (साझा बफर सी 2 जीबी, प्रभावी कैश सीए 7 जीबी)। ओएस उबंटू सर्वर 14.04 है, पोस्टग्रेस 9.3.6।दोनों चयन गणना (पीके) और चयन गणना (*) इतनी धीमी क्यों हैं?

SELECT count(id) और SELECT count(*) दोनों इस साधारण मामले में इतनी धीमी क्यों हैं (सीसीए 11 मिनट)?

पोस्टग्रेएसक्यूएल प्लानर इंडेक्स स्कैनिंग के बजाय पूर्ण टेबल स्कैन क्यों चुन रहा है जो कम से कम 25 गुना तेज होना चाहिए (मामले में जहां इसे एचडीडी से पूरी अनुक्रमणिका पढ़नी होगी)। या मैं गलत कहां हूँ?

बीटीडब्ल्यू पंक्ति में कई बार क्वेरी चला रहा है कुछ भी नहीं बदल रहा है। अभी भी सीसीए 11 मिनट।

निष्पादन यहाँ योजना:

Aggregate (cost=7500001.00..7500001.01 rows=1 width=0) (actual time=698316.978..698316.979 rows=1 loops=1) 
    Buffers: shared hit=192 read=6249809 
    -> Seq Scan on transaction (cost=0.00..7250001.00 rows=100000000 width=0) (actual time=0.009..680594.049 rows=100000001 loops=1) 
     Buffers: shared hit=192 read=6249809 
Total runtime: 698317.044 ms 
+0

पढ़ने के लिए डेटा की मात्रा 25x छोटी है और इसमें सभी कुंजी शामिल हैं जो गिनने के लिए पर्याप्त हैं, है ना? मैंने वाक्यूम पूर्ण और विश्लेषण दोनों चलाए हैं (जो बीटीडब्ल्यू 6 घंटे से अधिक समय लेते हैं)। – Kousalik

+0

क्या आपके पास उस तालिका में बहुत सी समवर्ती डीएमएल हो रही है? सूचकांक (और इच्छा) केवल तभी उपयोग किया जा सकता है जब यह विश्वसनीय हो। यदि कई समवर्ती लेनदेन (या अधूरे लेनदेन) हैं तो पोस्टग्रेर्स इंडेक्स का उपयोग करने का विकल्प नहीं चुन सकते हैं। क्या आपके पास एक और "लेनदेन में निष्क्रिय" कनेक्शन हैं जो उस तालिका को संशोधित कर चुके हैं? इसके अलावा 'random_page_cost' (http://www.postgresql.org/docs/current/static/runtime-config-query.html#GUC-RANDOM-PAGE-COST) का मान क्या है जो सेटिंग योजनाकार प्रवृत्ति को प्रभावित करेगा एक सूचकांक का उपयोग करें। –

+0

आप यह भी पढ़ना चाहेंगे: https://wiki.postgresql.org/wiki/Index-only_scans –

उत्तर

8

एक HDD की कल्पना को ध्यान में रखते आमतौर पर के बीच 50Mb/s और 100Mb/एस कहीं तो 48GB के लिए मैं 500 और 1000s के बीच सब कुछ पढ़ने के लिए उम्मीद करेंगे है।

चूंकि आपके पास कोई क्लॉज नहीं है, इसलिए प्लानर देखता है कि आप रिकॉर्ड के बड़े बहुमत में रूचि रखते हैं, इसलिए यह इंडेक्स का उपयोग नहीं करता क्योंकि इसे अतिरिक्त इंडेक्स की आवश्यकता होगी। कारण postgresql इंडेक्स का उपयोग एमवीसीसी में नहीं कर सकता है जो postgresql लेनदेन स्थिरता के लिए उपयोग करता है। इसके लिए सटीक परिणाम सुनिश्चित करने के लिए पंक्तियां खींची जाती हैं। (देखें https://wiki.postgresql.org/wiki/Slow_Counting)

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

आप एक सन्निकटन आप तालिका मेटाडाटा में reltuples क्षेत्र का उपयोग कर सकते के साथ रह सकते हैं:

SELECT reltuples FROM pg_class WHERE relname = 'tbl'; 

के बाद से यह सिर्फ एक ही पंक्ति इस तेज़ कर रहा है।

अपडेट: 9.2 के बाद से दृश्यता जानकारी को स्टोर करने का एक नया तरीका इंडेक्स-केवल होने की अनुमति देता है। हालांकि वहां कुछ चेतावनी हैं, खासकर ऐसे मामले में जहां पंक्तियों को सीमित करने के लिए कोई भविष्यवाणी नहीं है। अधिक जानकारी के लिए https://wiki.postgresql.org/wiki/Index-only_scans देखें।

+0

ठीक है अगर मैं गिनती आईडी चाहता हूं, तो केवल इंडेक्स स्कैन करना पर्याप्त होना चाहिए और बड़ी जीत होगी क्योंकि यह बहुत छोटा है। अनुक्रमिकता पढ़ने पर औसत पढ़ने की दर लगभग 100 एमबी/एस है। जिस चीज को मैं समझ नहीं पा रहा हूं वह यह है कि योजनाकार यह नहीं समझता कि मैं केवल अनुक्रमित मूल्य को गिनना चाहता हूं। मैं अभी एक ही चीज़ का परीक्षण नहीं कर सकता लेकिन मुझे पूरा यकीन है कि ओरेकल का पता चल जाएगा। कल ओरेकल के साथ कोशिश करेंगे। – Kousalik

+0

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

+0

कृपया स्रोत भी प्रदान करें, कृपया। धन्यवाद। – Kousalik

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