2017-03-15 24 views
1

我有一個25mln行 「Zemla」 表與索引爲什麼PostgreSQL爲簡單查詢做了這麼難的計劃?

CREATE INDEX zemla_level 
    ON public."Zemla" 
    USING btree 
    (level); 

現在我做的簡單的查詢

select * from "Zemla" where level = 7 

,並得到非常堅硬的查詢計劃

Bitmap Heap Scan on "Zemla" (cost=18316.26..636704.15 rows=978041 width=181) (actual time=216.681..758.663 rows=975247 loops=1) 
    Recheck Cond: (level = 7) 
    Heap Blocks: exact=54465 
    -> Bitmap Index Scan on zemla_level (cost=0.00..18071.74 rows=978041 width=0) (actual time=198.041..198.041 rows=1949202 loops=1) 
     Index Cond: (level = 7) 

和其他簡單的查詢哪些應該立即執行指數目前我認爲

select count(*) from "Zemla" where level = 7 

Aggregate (cost=639149.25..639149.26 rows=1 width=0) (actual time=1188.366..1188.366 rows=1 loops=1) 
    -> Bitmap Heap Scan on "Zemla" (cost=18316.26..636704.15 rows=978041 width=0) (actual time=213.918..763.833 rows=975247 loops=1) 
     Recheck Cond: (level = 7) 
     Heap Blocks: exact=54465 
     -> Bitmap Index Scan on zemla_level (cost=0.00..18071.74 rows=978041 width=0) (actual time=195.409..195.409 rows=1949202 loops=1) 
       Index Cond: (level = 7) 

我的問題是爲什麼PostgreSQL在第一次索引掃描之後做了另外一個位圖堆掃描,並且有很多開銷?

編輯:What is a "Bitmap heap scan" in a query plan?是另一個問題,因爲它回答了爲什麼一些使用OR運算符的查詢具有位圖堆掃描。我的查詢既沒有也沒有AND運算符

+0

「硬計劃」是什麼意思?向我們展示使用'explain(analyze)'生成的執行計劃,而不是一個簡單的解釋。 –

+0

固定問題解釋(分析) – alexey2baranov

+1

行估計是相當關閉。運行'真空分析「Zemla」'改變什麼? –

回答

1

如果我沒有弄錯,位圖堆掃描是從磁盤獲取數據的算法。它分析引擎必須提取並排序它們的所有磁盤頁面,以實現最小的硬盤驅動器磁頭移動。

它需要時間,因爲您的表必須非常大,並且可能在磁盤上高度碎片化。


關於你的第二查詢count(*),PostgreSQL的仍然需要閱讀的結果行,以驗證它們的存在;其他數據庫系統可能只需要在這種情況下引用索引。檢查此頁面瞭解更多信息:

https://wiki.postgresql.org/wiki/Index-only_scans


嘗試在桌子上VACCUM FULL,看看它加快東西。

相關問題