sql - Update ... from optimization. Postgres 9.1 -


मेरे पास दो बड़ी टेबल हैं:

  tbl_a id (int), cnt (int default) :। 0) tbl_b आईडी (पूर्णांक), a_id (int)  

मैं tbl_b में एक ही a_id वाली सभी पंक्तियों की गिनती और tbl_a में है कि मूल्य डाल करने के लिए neet

यहाँ मैं रास्ता मिल गया:

  अद्यतन tbl_a टीबी (a_id द्वारा tbl_b समूह से चयन गिनती (*) ग, a_id) cnt = से tb.c सेट जहां tb.a_id = tbl_a.id < / Code> 

लेकिन उस प्रश्न के बारे में प्रति पंक्ति 1000 8s के लिए काम करता है यह स्वीकार्य नहीं है, क्योंकि मेरे पास लगभग 6 एम वाले हैं।

अस्थायी तालिका बनाने की कोशिश की

  ... as (count count (*), a_id से tbl_b समूह a_id )  

और यहां तक ​​कि बी-ट्री इंडेक्स जोड़ा गया है, लेकिन कुछ भी परिवर्तन नहीं।

क्या वह उसी हार्डवेयर पर तेज़ी से प्रदर्शन कर सकता है?

UPD1: < / p>

 <कोड> "tbl_a पर अद्यतन (लागत = 0.00..343357.80 पंक्तियों = 40000 चौड़ाई = 459)" "- & gt; नेस्टेड लूप (लागत = 0.00..343357.80 पंक्तियों = 40000 चौड़ाई = 459)" " - & gt; Seq स्कैन tbl_b_temp पर (लागत = 0.00..617.00 पंक्तियों = 40000 चौड़ाई = 18) "" - & gt; tbl_a पर tbl_a_pkey का उपयोग कर सूचकांक स्कैन (लागत = 0.00..8.55 पंक्तियों = 1 चौड़ाई = 445) "" सूचकांक Cond : (id = tbl_b_temp.a_id) " 

पंक्तियों = 40000 क्योंकि मैं छोटे अस्थायी तालिका बनाई

क्वेरी:।

  बनाने अस्थायी तालिका tbl_b_temp चयन गिनती (*) के रूप में सी, a_id tbl_b समूह से a_id आदेश द्वारा a_id सीमा 40000; Btree (a_id) का उपयोग करके tbl_b पर इंडेक्स a_id_ind बनाएँ;  अस्थायी तालिका के साथ काम करते समय,    

इसे बनाने या बदलने के बाद इसकी जांच करें, क्योंकि ऑटोवॉक्वायम में अस्थायी तालिकाओं को शामिल नहीं किया गया है। यह पोस्टगेस के साथ आने वाली क्वेरी प्लान में सुधार ला सकता है।

अस्थायी टेबल ऑटोवॉक्वेम द्वारा एक्सेस नहीं की जा सकतीं इसलिए, उचित वैक्यूम और ऑपरेशन का विश्लेषण सत्र एसक्यूएल कमांड के जरिए किया जाना चाहिए।


Comments