當前位置:編程學習大全網 - 源碼下載 - PostgreSQL DBA(6) - SeqScan vs IndexScan vs BitmapHeapScan

PostgreSQL DBA(6) - SeqScan vs IndexScan vs BitmapHeapScan

本節介紹了PostgreSQL中數據表的三種掃描類型,分別是順序掃描SeqScan、索引掃描IndexScan和位圖堆掃描BitmapHeapScan。

選擇率=條件過濾後的元組數/條件過濾前的元組數

順序掃描SeqScan

直接對數據表堆數據(Heap Data)進行順序掃描,適用於選擇率較高的場景.

索引掃描IndexScan

通過訪問索引獲得元組位置指針後再訪問堆數據,適用於選擇率較低的場景.

位圖堆掃描BitmapHeapScan

位圖堆掃描需要首先通過BitmapIndexScan(位圖索引掃描)把符合條件的元組所在的Page(Block) ID存儲在Bitmap中,然後再通過Bitmap訪問堆數據,適用於選擇率不高不低的場景,介於上面兩種掃描方式之間.

2018.10.01 修正,索引適用於選擇率低的情況,順序掃描適用於選擇率高的情況

值得註意的地方:

1."選擇率較高"是壹種定性的表述,實際上PG是根據Cost計算來確定使用哪種掃描方式.通常情況下,索引掃描主要執行的操作是隨機訪問存儲設備,在PG的初始化參數配置中,隨機訪問的Cost是4,而順序訪問的Cost是1,很粗略的估算,如果通過索引訪問的Index Blocks + Heap Blocks超過順序訪問的Heap Blocks的1/4,那麽PG會選擇使用順序掃描而不是索引掃描.

2.IndexScan的掃描方式是訪問索引,如符合條件則馬上根據索引中的元組位置指針訪問堆數據從而獲取元組,而BitmapIndexScan(位圖索引掃描)是訪問索引,把符合條件的Block ID存儲在Bitmap中,這時候不涉及掃描堆數據,最終獲取元組的操作通過BitmapHeapScan掃描完成.

這兩者的不同,下面這段話總結得非常到位:

下面通過樣例腳本直觀感受這幾種方式的不同.

測試數據表,t_dwxx,10000行數據,在dwbh上創建PK

測試腳本:

查詢條件為dwbh > '1000',選擇率較低,PG選擇了順序掃描SeqScan,成本189.00,該成本如何計算,有興趣的可參照 源碼解讀(53) ,通過gdb跟蹤分析.

測試腳本:

查詢條件為dwbh = '10000',選擇率很高,只有1條記錄,選擇索引掃描.

總成本8.30=啟動成本 + 壹次Index Block訪問 + 壹次Heap Block訪問=0.29 + 4 + 4≈8.30

測試腳本:

查詢條件為dwbh > '1000' and dwbh < '3000',選擇率不高不低,PG選擇了BitmapHeapScan,啟動成本為51.07,總成本為148.42,該成本如何計算,後續的源碼解讀會跟蹤分析.

值得註意的是在BitmapIndexScan後有壹步:Recheck,這是因為位圖索引掃描只是把Heap Block ID找出來,並沒有把符合條件的元組找出來,因此出現了Recheck這壹步.

PostgreSQL indexing: Index scan vs. Bitmap scan vs. Sequential scan

Bitmap indexes

What is a “Bitmap heap scan” in a query plan?

  • 上一篇:組裝電腦如何選擇配置?
  • 下一篇:如何用VBA解析XML問題,怎麽解決
  • copyright 2024編程學習大全網