Postgresql

PostgreSQL 8.3:大表上的慢 GROUP BY

  • February 9, 2013

我有一張包含大約 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 秒。這足以滿足我的需求。

感謝大家在評論中的幫助。

引用自:https://dba.stackexchange.com/questions/33677