2015-10-02 4 views
5

में साझा हिट कैश मैं EXPLAIN कमांड के साथ प्रयोग कर रहा हूं और यह पता लगाने की कोशिश कर रहा हूं कि shared hit क्या है।postgreSQL

Seq Scan on foo (cost=0.00..18334.00 rows=1000000 width=37) (actual time=0.030..90.500 rows=1000000 loops=1) 
    Buffers: shared hit=512 read=7822 
Total runtime: 116.080 ms 

मैंने देखा है कि अधिक साझा हिट नंबर हमारे पास तेजी से एक क्वेरी निष्पादित की जा रही है। लेकिन वह क्या है? जहां तक ​​मुझे मिला, shared read सिर्फ RAID या SSD जैसे भौतिक संग्रहण से पढ़ रहा है। लेकिन shared hit तेज क्यों है? क्या यह राम के अंदर संग्रहीत है या कहां?

+2

'साझा hit':

कैसे Postgres साझा बफ़र्स का प्रबंधन करता है पर कई प्रस्तुतियों रहे हैं मूल्य कैम को मापें ई से (साझा) मेमोरी और हार्ड डिस्क –

+0

@a_horse_with_no_name से नहीं पढ़ा जाता है यह स्मृति मेमोरी पढ़ने के बिना स्मृति (केस में साझा) से कैसे संभव है? मुझे समझ में नहीं आता ... –

+0

@a_horse_with_no_name क्या है [that] (https://en.wikipedia.org/wiki/Shared_memory_%28interprocess_communication%29) साझा स्मृति अवधारणा के बारे में आपने बात की थी? –

उत्तर

8

shared hit अनिवार्य रूप से इसका मतलब है कि कंप्यूटर की मुख्य स्मृति में मूल्य पहले से ही कैश किया गया है और इसे हार्ड डिस्क से पढ़ने के लिए आवश्यक नहीं था।

मुख्य मेमोरी (रैम) तक पहुंच हार्ड 0 से मूल्य पढ़ने से अधिक तेज है। और यही कारण है कि क्वेरी तेजी से अधिक शेयर हिट है।

पोस्टग्रेस शुरू करने के तुरंत बाद, मुख्य मेमोरी (रैम) में कोई भी डेटा उपलब्ध नहीं है और हार्ड डिस्क से सबकुछ पढ़ने की जरूरत है।

एक कार्य योजना लागू करके से इस कदम पर विचार करें:

-> Seq Scan on products.product_price (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.053..103.958 rows=392273 loops=1) 
     Output: product_id, valid_from, valid_to, price 
     Buffers: shared read=2818 
     I/O Timings: read=48.382 

हिस्सा "बफ़र: पढ़ा साझा = 2818" का मतलब है कि 2818 ब्लॉक (प्रत्येक 8k) हार्ड डिस्क से पढ़ा जा सकता था (और है कि 48ms ले लिया - मेरे पास एक एसएसडी है)। उन 2818 ब्लॉक कैश ("shared buffers") में संग्रहीत किए गए थे ताकि अगली बार उन्हें डेटाबेस की आवश्यकता हो (उन्हें) धीमी गति से (धीमी) हार्ड डिस्क से पढ़ने की आवश्यकता नहीं है।

कि बयान योजना में परिवर्तन जब मैं फिर से चलाने:

-> Seq Scan on products.product_price (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.012..45.690 rows=392273 loops=1) 
     Output: product_id, valid_from, valid_to, price 
     Buffers: shared hit=2818 

जिसका मतलब है कि उन 2818 ब्लॉक कि पिछले बयान मुख्य स्मृति (= रैम) में थे और Postgres पढ़ने की जरूरत नहीं था उन्हें हार्ड डिस्क से।

"स्मृति" हमेशा कंप्यूटर में निर्मित मुख्य मेमोरी (रैम) को संदर्भित करता है और सीपीयू के लिए सीधे पहुंच योग्य होता है - "बाहरी भंडारण" के विपरीत।