簡體   English   中英

Postgres中的索引掃描與順序掃描

[英]Index Scan Vs Sequential scan in Postgres

我正在使用 Postgres 數據庫,我試圖在 1000000 行的表上查看索引掃描和順序掃描之間的區別

描述表

\d grades 

在此處輸入圖像描述

然后解釋分析 10 到 500000 之間的行

explain analyze select name from grades where pid between 10 and 500000 ; 

在此處輸入圖像描述

然后解釋分析 10 到 600000 之間的行

explain analyze select name from grades where pid between 10 and 600000 ;

在此處輸入圖像描述

對我來說奇怪的是為什么它在第一個查詢中進行索引掃描並在第二個查詢中進行順序掃描,盡管它們通過索引中包含的同一列進行查詢。

如果您只需要單個表行,則索引掃描比順序掃描快得多。 如果您需要整個表,順序掃描比索引掃描快。
在這之間的某個地方是 PostgreSQL 在這兩種訪問方法之間切換的轉折點。

您可以調整random_page_cost以影響選擇順序掃描的點。 如果您有 SSD 存儲,則應將參數設置為 1.0 或 1.1 以告訴 PostgreSQL 索引掃描在您的硬件上更便宜。

PostgreSQL 使用基於成本的優化器,而不是基於規則的優化器。 如果您采用索引掃描的估計成本 18693,並通過兩個計划之間的預期行的比率線性擴展它(這不是計划器所做的,但應該是一個足夠好的第一個近似值)你得到22330。這比 seq 掃描的預期成本 21372 高,所以它選擇了 seq 掃描。

如果你以同樣的方式擴大索引掃描的實際時間,你會得到 89 毫秒,這比 seq 掃描的實際速度略快。 所以也許規划者在這里犯了一個非常輕微的錯誤,但在實踐中肯定沒有什么可擔心的。

如果運行時間的差異是 10 倍,而不是 10%,那可能值得進一步研究。

這是因為如果 SELECT 返回表中所有行的大約 5-10% 以上,則順序掃描比索引掃描快得多。 並且您的第二個查詢達到了該閾值; 因為您正在獲取更多行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM