開滿天機(jī)
2019-11-12 10:49:14
非常簡單的示例-一個(gè)表,一個(gè)索引,一個(gè)查詢: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)為什么不執(zhí)行索引掃描呢?我想念什么?
3 回答

繁星點(diǎn)點(diǎn)滴滴
TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果SELECT返回表中所有行的大約5-10%,則順序掃描比索引掃描快得多。
這是因?yàn)樗饕龗呙栊枰獮槊恳恍袌?zhí)行多個(gè) IO操作(在索引中查找該行,然后從堆中檢索該行)。順序掃描每行僅需要一個(gè)IO-甚至更少,因?yàn)榇疟P上的一個(gè)塊(頁面)包含多于一行,因此可以通過單個(gè)IO操作來獲取多于一行。
順便說一句:其他DBMS也是如此-保留了一些優(yōu)化功能,例如“僅索引掃描”(但是對于SELECT *,這種DBMS不太可能會(huì)進(jìn)行“僅索引掃描”)

慕田峪4524236
TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
您是否分析了表/數(shù)據(jù)庫?那統(tǒng)計(jì)呢?如果有很多記錄,年份> 2009,則順序掃描可能比索引掃描更快。

回首憶惘然
TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
在索引掃描中,讀取頭從一行跳到另一行,這比讀取下一個(gè)物理塊要慢1000倍(在順序掃描中)。
因此,如果(要檢索的記錄數(shù)* 1000)小于記錄總數(shù),則索引掃描會(huì)更好。
- 3 回答
- 0 關(guān)注
- 769 瀏覽
添加回答
舉報(bào)
0/150
提交
取消