PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

3 मिलियन पंक्तियों के साथ PostgreSQL डेटाबेस पर धीमी सरल अद्यतन क्वेरी

मुझे प्रत्येक पंक्तियों के लिए विभिन्न मूल्यों के साथ 1 या 2 बिलियन पंक्तियों की तालिकाएँ अपडेट करनी होंगी। प्रत्येक रन ~ 100 मिलियन परिवर्तन (10%) करता है। मेरी पहली कोशिश थी कि उन्हें 300K अपडेट के लेन-देन में सीधे एक विशिष्ट विभाजन पर समूहित किया जाए क्योंकि यदि आप विभाजन का उपयोग करते हैं तो Postgresql हमेशा तैयार प्रश्नों को अनुकूलित नहीं करता है।

  1. "UPDATE myTable SET myField=value WHEREmyId=id" के समूह का लेन-देन
    देता है 1,500 अद्यतन/सेकंड। जिसका अर्थ है कि प्रत्येक दौड़ में कम से कम 18 घंटे लगेंगे।
  2. हॉट अपडेट समाधान जैसा कि यहां FILLFACTOR=50 के साथ वर्णित है। 1,600 अपडेट/सेकंड देता है। मैं एसएसडी का उपयोग करता हूं इसलिए यह एक महंगा सुधार है क्योंकि यह भंडारण के आकार को दोगुना कर देता है।
  3. अद्यतन मूल्य की एक अस्थायी तालिका में सम्मिलित करें और अद्यतन के बाद उन्हें मर्ज करें...FROM 18,000 देता है अद्यतन/सेकंड। यदि मैं प्रत्येक विभाजन के लिए VACUUM करता हूँ; अन्यथा 100,000 ऊपर/एस। Cooool.
    यह है संचालन के क्रम:
CREATE TEMP TABLE tempTable (id BIGINT NOT NULL, field(s) to be updated,
CONSTRAINT tempTable_pkey PRIMARY KEY (id));

उपलब्ध RAM के आधार पर बफ़र में अद्यतनों का एक गुच्छा जमा करेंजब यह भर जाता है, या तालिका/विभाजन को बदलने की आवश्यकता होती है, या पूरा हो जाता है:

COPY tempTable FROM buffer;
UPDATE myTable a SET field(s)=value(s) FROM tempTable b WHERE a.id=b.id;
COMMIT;
TRUNCATE TABLE tempTable;
VACUUM FULL ANALYZE myTable;

इसका मतलब है कि एक रन अब 100 मिलियन अपडेट के लिए 18h के बजाय 1.5h लेता है, जिसमें वैक्यूम भी शामिल है। समय बचाने के लिए, अंत में एक वैक्यूम पूर्ण बनाना आवश्यक नहीं है, लेकिन एक तेज़ नियमित वैक्यूम भी डेटाबेस पर आपकी लेनदेन आईडी को नियंत्रित करने और भीड़ के घंटों के दौरान अवांछित ऑटोवैक्यूम प्राप्त करने के लिए उपयोगी नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL इनर जॉइन के साथ डिलीट

  2. Plpgsql में सरणी आयाम पर लूप करें

  3. हेरोकू और रेल:पोस्टग्रेज के साथ जेम लोड त्रुटि, हालांकि यह GEMFILE में निर्दिष्ट है

  4. PostgreSQL के साथ उत्पादन में जाने के लिए दस युक्तियाँ

  5. पीजी -वी 0.17.1 . स्थापित करना