簡體   English   中英

優化 SQL 查詢大表

[英]Optimizing SQL query on large table

我可以做任何優化來加速這個查詢。 目前運行需要 30 分鍾。

SELECT
    *
FROM
    service s
JOIN 
    bucket b ON s.procedure = b.hcpc
WHERE 
    month >= '201904'
    AND bucket = 'Respirator'

解釋執行計划——

Gather  (cost=1002.24..81397944.91 rows=9782404 width=212)
  Workers Planned: 2
->  Hash Join  (cost=2.24..80418704.51 rows=4076002 width=212)
        Hash Cond: ((s .procedure)::text = (bac.hcpc)::text)
        ->  Parallel Seq Scan on service s   (cost=0.00..77753288.33 rows=699907712 width=154)
              Filter: ((month)::text >= '201904'::text)
        ->  Hash  (cost=2.06..2.06 rows=14 width=58)
              ->  Seq Scan on buckets b  (cost=0.00..2.06 rows=14 width=58)
                    Filter: ((bucket)::text = 'Respirator'::text)

查詢優化是沒有超級硬和快速規則的東西,它更像是一個反復試驗的東西。 有時你會嘗試一種技術,它會很好地工作,但同樣的技術對另一個查詢幾乎沒有影響。 話雖這么說,這里有幾件事我會試着讓你開始。

  1. 而不是SELECT * ,列出您需要的列名。 如果您需要所有這兩個表,仍然列出它們。
  2. 您可以在WHERE子句中使用任何數字列來進行一些初步過濾嗎? 僅比較字符串數據類型幾乎總是查詢優化的痛點。
  3. 查看表上的現有索引,看看是否需要進行任何更改。 索引會對查詢性能產生巨大的影響,無論是正面的還是負面的,都取決於設置。

同樣,這都是反復試驗,這些只是開始的幾個地方。

SELECT *
FROM service s JOIN 
     bucket b
     ON s.procedure = b.hcpc
WHERE s.month >= '201904' AND
      b.bucket = 'Respirator';

我建議索引:

  • bucket(bucket, hcpc)
  • service(procedure, month)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM