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

हर 15 मिनट में एक पंक्ति के लिए एक विशाल समय श्रृंखला तालिका को कुशलतापूर्वक क्वेरी करना

15 मिनट के अंतराल के लिए:

with i as (
    select cf.tagindex, min(dateandtime) dateandtime
    from contfloattable cf
    group by
        floor(extract(epoch from dateandtime) / 60 / 15),
        cf.tagindex
)
select cf.dateandtime, cf."Val", cf.status, t.tagname
from
    contfloattable cf
    inner join
    conttagtable t on cf.tagindex = t.tagindex
    inner join
    i on i.tagindex = cf.tagindex and i.dateandtime = cf.dateandtime
order by cf.dateandtime, t.tagname

इस क्वेरी के लिए व्याख्या आउटपुट दिखाएं (यदि यह काम करता है) ताकि हम अनुकूलित करने का प्रयास कर सकें। आप इसे इस उत्तर में पोस्ट कर सकते हैं।

आउटपुट की व्याख्या करें

"Sort  (cost=15102462177.06..15263487805.24 rows=64410251271 width=57)"
"  Sort Key: cf.dateandtime, t.tagname"
"  CTE i"
"    ->  HashAggregate  (cost=49093252.56..49481978.32 rows=19436288 width=12)"
"          ->  Seq Scan on contfloattable cf  (cost=0.00..38528881.68 rows=1408582784 width=12)"
"  ->  Hash Join  (cost=270117658.06..1067549320.69 rows=64410251271 width=57)"
"        Hash Cond: (cf.tagindex = t.tagindex)"
"        ->  Merge Join  (cost=270117116.39..298434544.23 rows=1408582784 width=25)"
"              Merge Cond: ((i.tagindex = cf.tagindex) AND (i.dateandtime = cf.dateandtime))"
"              ->  Sort  (cost=2741707.02..2790297.74 rows=19436288 width=12)"
"                    Sort Key: i.tagindex, i.dateandtime"
"                    ->  CTE Scan on i  (cost=0.00..388725.76 rows=19436288 width=12)"
"              ->  Materialize  (cost=267375409.37..274418323.29 rows=1408582784 width=21)"
"                    ->  Sort  (cost=267375409.37..270896866.33 rows=1408582784 width=21)"
"                          Sort Key: cf.tagindex, cf.dateandtime"
"                          ->  Seq Scan on contfloattable cf  (cost=0.00..24443053.84 rows=1408582784 width=21)"
"        ->  Hash  (cost=335.74..335.74 rows=16474 width=44)"
"              ->  Seq Scan on conttagtable t  (cost=0.00..335.74 rows=16474 width=44)"

ऐसा लगता है कि आपको इस अनुक्रमणिका की आवश्यकता है:

create index cf_tag_datetime on contfloattable (tagindex, dateandtime)

analyzeचलाएं इसे बनाने के बाद। अब ध्यान दें कि बड़ी टेबल पर किसी भी इंडेक्स का डेटा परिवर्तन (सम्मिलित आदि) पर महत्वपूर्ण प्रदर्शन प्रभाव पड़ेगा क्योंकि इसे प्रत्येक परिवर्तन पर अपडेट करना होगा।

अपडेट करें

मैंने cf_tag_datetime अनुक्रमणिका (tagindex, dateandtime) जोड़ी और यहाँ नया विवरण दिया गया है:

"Sort  (cost=15349296514.90..15512953953.25 rows=65462975340 width=57)"
"  Sort Key: cf.dateandtime, t.tagname"
"  CTE i"
"    ->  HashAggregate  (cost=49093252.56..49490287.76 rows=19851760 width=12)"
"          ->  Seq Scan on contfloattable cf  (cost=0.00..38528881.68 rows=1408582784 width=12)"
"  ->  Hash Join  (cost=270179293.86..1078141313.22 rows=65462975340 width=57)"
"        Hash Cond: (cf.tagindex = t.tagindex)"
"        ->  Merge Join  (cost=270178752.20..298499296.08 rows=1408582784 width=25)"
"              Merge Cond: ((i.tagindex = cf.tagindex) AND (i.dateandtime = cf.dateandtime))"
"              ->  Sort  (cost=2803342.82..2852972.22 rows=19851760 width=12)"
"                    Sort Key: i.tagindex, i.dateandtime"
"                    ->  CTE Scan on i  (cost=0.00..397035.20 rows=19851760 width=12)"
"              ->  Materialize  (cost=267375409.37..274418323.29 rows=1408582784 width=21)"
"                    ->  Sort  (cost=267375409.37..270896866.33 rows=1408582784 width=21)"
"                          Sort Key: cf.tagindex, cf.dateandtime"
"                          ->  Seq Scan on contfloattable cf  (cost=0.00..24443053.84 rows=1408582784 width=21)"
"        ->  Hash  (cost=335.74..335.74 rows=16474 width=44)"
"              ->  Seq Scan on conttagtable t  (cost=0.00..335.74 rows=16474 width=44)"

ऐसा लगता है कि समय में वृद्धि हुई है :( हालांकि, अगर मैं खंड द्वारा आदेश हटा देता हूं (बिल्कुल मुझे जो चाहिए, लेकिन काम नहीं करेगा), तो यही होता है, बड़ी कमी:

"Hash Join  (cost=319669581.62..1127631600.98 rows=65462975340 width=57)"
"  Hash Cond: (cf.tagindex = t.tagindex)"
"  CTE i"
"    ->  HashAggregate  (cost=49093252.56..49490287.76 rows=19851760 width=12)"
"          ->  Seq Scan on contfloattable cf  (cost=0.00..38528881.68 rows=1408582784 width=12)"
"  ->  Merge Join  (cost=270178752.20..298499296.08 rows=1408582784 width=25)"
"        Merge Cond: ((i.tagindex = cf.tagindex) AND (i.dateandtime = cf.dateandtime))"
"        ->  Sort  (cost=2803342.82..2852972.22 rows=19851760 width=12)"
"              Sort Key: i.tagindex, i.dateandtime"
"              ->  CTE Scan on i  (cost=0.00..397035.20 rows=19851760 width=12)"
"        ->  Materialize  (cost=267375409.37..274418323.29 rows=1408582784 width=21)"
"              ->  Sort  (cost=267375409.37..270896866.33 rows=1408582784 width=21)"
"                    Sort Key: cf.tagindex, cf.dateandtime"
"                    ->  Seq Scan on contfloattable cf  (cost=0.00..24443053.84 rows=1408582784 width=21)"
"  ->  Hash  (cost=335.74..335.74 rows=16474 width=44)"
"        ->  Seq Scan on conttagtable t  (cost=0.00..335.74 rows=16474 width=44)"

मैंने अभी तक इस सूचकांक की कोशिश नहीं की है ... हालांकि ऐसा करूंगा। स्टैंडबाय।

अब इसे फिर से देखने पर मुझे लगता है कि उलटा सूचकांक और भी बेहतर हो सकता है क्योंकि इसका उपयोग न केवल Merge Join में किया जा सकता है लेकिन अंतिम Sort . में भी :

create index cf_tag_datetime on contfloattable (dateandtime, tagindex)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कैसे Justify_hours () PostgreSQL में काम करता है

  2. psycopg2 और अनंत पायथन लिपि

  3. एक आंतरिक जुड़ाव से मिली जल्द से जल्द तारीख की गिनती?

  4. स्तंभ नाम END के साथ END पर या उसके निकट सिंटैक्स त्रुटि

  5. MyBatis के साथ बाइटा कॉलम से मैं बाइट [] कैसे प्राप्त कर सकता हूं?