2017-06-22 63 views
0

今天我遇到了一個奇怪的問題。我在postgres(表T)中有一個大表,它有很多列(col1..col100),我有索引I1(col2,col3,col4)。Postgtres查詢未使用索引列索引

現在

explain select col2,col3 from T; 

顯示SEQ掃描的表,而不是使用索引。我認爲它應該像索引只掃描,因爲我們正在選擇索引中的列。

可能是什麼原因?

回答

0

如果SELECT返回比約5-10%以上(取決於配置設置和數據的存儲。這不是一個很難數)的所有行的表中,按順序進行掃描比索引掃描快得多。

索引掃描對每一行都需要多個IO操作(查找索引中的行,然後從堆中檢索行)。順序掃描對每一行只需要一個IO,甚至更少,因爲磁盤上的塊(頁面)包含多個行,因此可以通過單個IO操作獲取多行。

對於其他DBMS也是如此 - 一些優化被視爲「僅索引掃描」(但對於SELECT *,這是非常不可能的,這樣的DBMS將用於「僅索引掃描」)