2011-03-05 59 views
90

例子很簡單 - 一個表,一個索引,一個查詢:爲什麼PostgreSQL對索引列執行順序掃描?

CREATE TABLE book 
(
    id bigserial NOT NULL, 
    "year" integer, 
    -- other columns... 
); 

CREATE INDEX book_year_idx ON book (year) 

EXPLAIN 
SELECT * 
    FROM book b 
    WHERE b.year > 2009 

給我:

Seq Scan on book b (cost=0.00..25663.80 rows=105425 width=622) 
    Filter: (year > 2009) 

爲什麼它不執行索引掃描呢? 我錯過了什麼?

回答

135

如果SELECT返回表中所有行的約5-10%以上,則順序掃描比索引掃描快得多。

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

順便說一句:這是對其他DBMS以及真實的 - 一些優化,如採取擱置「僅掃描索引」(但對於一個SELECT *這是極不可能這樣的DBMS會去的「僅索引掃描」)

+6

5-10%取決於一些配置設置和數據存儲。這不是一個硬數字。 – 2011-03-05 13:05:09

+4

@Frank:這就是爲什麼我說「大約」:)但是,感謝您指出 – 2011-03-05 13:06:27

+0

有趣的是,這爲我解釋了很多事情:) 事實上,當我選擇年份> 2010年,它確實索引掃描。 謝謝! – wajda 2011-03-05 15:24:02

8

您是ANALYZE表/數據庫嗎?那麼statistics呢?當年份> 2009年的記錄較多時,順序掃描可能比索引掃描更快。

相關問題