मेरे पास एक पोस्टग्रेएसक्यू 9.2 उदाहरण है जो आरएचईएल 6.3 पर चल रहा है, 16 जीबी रैम के साथ 8-कोर मशीन है। सर्वर इस डेटाबेस के लिए समर्पित है। यह देखते हुए कि डिफ़ॉल्ट postgresql.conf मेमोरी सेटिंग्स के संबंध में काफी रूढ़िवादी है, मैंने सोचा कि पोस्टग्रेज को अधिक मेमोरी का उपयोग करने की अनुमति देने के लिए यह एक अच्छा विचार हो सकता है। मेरे आश्चर्य के लिए, wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server पर निम्नलिखित सलाह व्यावहारिक रूप से मेरे द्वारा चलाए जाने वाले प्रत्येक प्रश्न को धीमा कर देती है, लेकिन यह अधिक जटिल प्रश्नों पर स्पष्ट रूप से ध्यान देने योग्य है।
मैंने भी pgtune चलाने की कोशिश की, जिसमें अधिक मापदंडों के साथ निम्नलिखित सिफारिश दी गई, लेकिन इससे कुछ भी नहीं बदला। यह सुझाव देता है कि 1/4 रैम आकार के शेयर्ड_बफर्स जो कहीं और (और विशेष रूप से पीजी विकी पर) सलाह के अनुरूप लगता है।
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
मैंने सेटिंग्स को बदलने (उपयोग करने reindex database
) के बाद पूरे डेटाबेस को रीइन्डेक्सिंग करने की कोशिश की , लेकिन इससे भी मदद नहीं मिली। मैंने Share_buffers और work_mem के साथ खेला। धीरे-धीरे उन्हें बहुत रूढ़िवादी डिफ़ॉल्ट मूल्यों (128k / 1MB) से बदलना धीरे-धीरे प्रदर्शन में कमी आई।
मैं EXPLAIN (ANALYZE,BUFFERS)
कुछ प्रश्नों पर भाग गया और अपराधी को लगता है कि हैश जॉइन काफी धीमा है। यह मेरे लिए स्पष्ट क्यों नहीं है।
कुछ विशिष्ट उदाहरण देने के लिए, मेरे पास निम्नलिखित प्रश्न हैं। यह डिफ़ॉल्ट कॉन्फ़िगरेशन पर ~ 2100ms में चलता है और ~ बफर विस्तार के साथ कॉन्फ़िगरेशन पर ~ 3300ms:
select count(*) from contest c
left outer join contestparticipant cp on c.id=cp.contestId
left outer join teammember tm on tm.contestparticipantid=cp.id
left outer join staffmember sm on cp.id=sm.contestparticipantid
left outer join person p on p.id=cp.personid
left outer join personinfo pi on pi.id=cp.personinfoid
where pi.lastname like '%b%' or pi.firstname like '%a%';
EXPLAIN (ANALYZE,BUFFERS)
उपरोक्त क्वेरी के लिए:
- डिफ़ॉल्ट बफ़र्स: http://explain.depesz.com/s/xaHJ
- बड़ा बफ़र: http://explain.depesz.com/s/Plk
सवाल यह है कि जब मैं बफर साइज़ बढ़ाता हूँ तो प्रदर्शन में कमी क्यों आ रही है? मशीन निश्चित रूप से स्मृति से बाहर नहीं चल रही है। यदि ओएस में साझा मेमोरी है ( shmmax
और shmall
) बहुत बड़े मूल्यों पर सेट है, तो यह समस्या नहीं होनी चाहिए। मुझे पोस्टग्रेज लॉग में कोई त्रुटि नहीं मिल रही है। मैं डिफ़ॉल्ट कॉन्फ़िगरेशन में ऑटोवैक्यूम चला रहा हूं लेकिन मुझे उम्मीद नहीं है कि इसके साथ कुछ भी करना है। सभी प्रश्न एक ही मशीन पर कुछ सेकंड के लिए चलाए गए थे, बस परिवर्तित कॉन्फ़िगरेशन (और पुनः आरंभ किए गए पीजी) के साथ।
संपादित करें: मुझे सिर्फ एक विशेष रूप से दिलचस्प तथ्य मिला: जब मैं अपने मध्य 2010 के iMac (OSX 10.7.5) पर भी यही परीक्षण करता हूं, तो Postgres 9.2.1 और 16GB RAM के साथ, मुझे धीमा अनुभव नहीं होता है। विशेष रूप से:
set work_mem='1MB';
select ...; // running time is ~1800 ms
set work_mem='96MB';
select ...' // running time is ~1500 ms
जब मैं सर्वर पर ठीक उसी डेटा के साथ एक ही क्वेरी (ऊपर वाला) करता हूं तो मुझे 96 एमबी के साथ वर्क_म = 1 एमबी और 3200 एमएस के साथ 2100 एमएस मिलते हैं।
मैक में एसएसडी है इसलिए यह काफी तेजी से है, लेकिन यह एक व्यवहार प्रदर्शित करता है जिसकी मुझे उम्मीद है।
Pgsql- प्रदर्शन पर अनुवर्ती चर्चा भी देखें ।