これは私のクエリです:
SELECT SUM(amount) FROM bill WHERE name = 'peter'
テーブルには 800K 以上の行があります。EXPLAIN ANALYZE
言います:
Aggregate (cost=288570.06..288570.07 rows=1 width=4) (actual time=537213.327..537213.328 rows=1 loops=1)
-> Seq Scan on bill (cost=0.00..288320.94 rows=498251 width=4) (actual time=48385.201..535941.041 rows=800947 loops=1)
Filter: ((name)::text = 'peter'::text)
Rows Removed by Filter: 8
Total runtime: 537213.381 ms
すべての行が影響を受けますが、これは正しいことです。しかし、なぜそんなに長いのですか?実行なしの同様のクエリは、WHERE
はるかに高速に実行されます。
ANALYZE EXPLAIN SELECT SUM(amount) FROM bill
Aggregate (cost=137523.31..137523.31 rows=1 width=4) (actual time=2198.663..2198.664 rows=1 loops=1)
-> Index Only Scan using idx_amount on bill (cost=0.00..137274.17 rows=498268 width=4) (actual time=0.032..1223.512 rows=800955 loops=1)
Heap Fetches: 533399
Total runtime: 2198.717 ms
に索引がamount
あり、 に索引がありname
ます。インデックスを見逃していませんか?
ps。新しい idex を追加するだけで問題を解決できましたON bill(name, amount)
。なぜそれが役に立ったのかわからなかったので、しばらく質問を開いたままにしておきます...