2

これは私のクエリです:

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)。なぜそれが役に立ったのかわからなかったので、しばらく質問を開いたままにしておきます...

4

1 に答える 1