Postgresql
PostgreSQL 8.3:大表上的慢 GROUP BY
我有一張包含大約 1000 萬條記錄的表。我想做一個簡單的分組,但它使用順序掃描並且速度很慢……
select run_id, count(*) from result group by run_id;
我在
run_id
列上定義了一個索引。我怎樣才能加快速度?
那麼為什麼 Postgres 9.2 仍然顯示順序掃描呢?我引用Postgres Wiki:
“count(*)”現在快得多了嗎?
對 PostgreSQL 的一個傳統抱怨,通常在將其與 MySQL 進行比較時(至少在使用不使用 MVCC 的 MyIsam 儲存引擎時)是“count() 很慢”。僅索引掃描可*用於滿足這些查詢,而無需任何謂詞來限制返回的行數,也無需通過指定元組應按索引列排序來強制使用索引。然而,在實踐中,這並不是特別可能。
重要的是要認識到規劃器關心的是最小化查詢的總成本。對於數據庫,I/O 成本通常占主導地位。出於這個原因,“count(*) without any predicate”查詢將僅在索引明顯小於其表時使用僅索引掃描。這通常只發生在表的行寬比某些索引寬得多的情況下。
強調我的。
只要您的 talbe 沒有因更多(大)列而臃腫,這裡的索引掃描幾乎沒有任何好處。
我一夜之間升級到 PostgreSQL 9.2。
EXPLAIN
仍然使用順序掃描顯示查詢,但查詢現在似乎執行得更快……不到 10 秒。這足以滿足我的需求。感謝大家在評論中的幫助。