2014-04-16 102 views
0

我有2個表如下:爲什麼Postgres的不使用我的查詢索引

tb_st: 
Columns: 
st_id | integer 
st  | character varying(80) 
type | integer 
Indexes: 
    PRIMARY KEY (st_id) 
    UNIQUE INDEX (st, type) 
    INDEX (st) 

tb_pd: 
Column 
st_id | integer 
bot_id | integer 
Indexes: 
    PRIMARY KEY (st_id, bot_id) 
    INDEX (bot_id) 
Foreign-key constraints: 
    FOREIGN KEY (st_id) REFERENCES tb_st(st_id) 

當我解釋查詢:

select p.bot_id 
from tb_pd p inner join 
    tb_st s 
    on p.st_id = s.st_id 
where s.st = 'abc' and s.type = 1 

的Postgres給了我這樣的:

Nested Loop (cost=4.24..16.10 rows=11 width=194) 
    -> Seq Scan on tb_st s (cost=0.00..1.07 rows=1 width=186) 
     Filter: (((st)::text = 'abc'::text) AND (type = 1)) 
    -> Bitmap Heap Scan on tb_pd p (cost=4.24..14.91 rows=11 width=8) 
     Recheck Cond: (st_id = s.st_id) 
     -> Bitmap Index Scan on tb_pd_pkey (cost=0.00..4.24 rows=11 width=0) 
       Index Cond: (st_id = s.st_id) 
(7 rows) 

經過一段時間,給了我這個完全相同的查詢(仍然沒有使用索引):

Nested Loop (cost=0.00..2.19 rows=1 width=4) 
    Join Filter: (p.st_id = s.st_id) 
    -> Seq Scan on tb_st s (cost=0.00..1.07 rows=1 width=4) 
     Filter: (((st)::text = 'abc'::text) AND (type = 1)) 
    -> Seq Scan on tb_pd p (cost=0.00..1.05 rows=5 width=8) 
(5 rows) 

我的問題是:如果我只是過濾了一個st值和一個構成UNIQUE INDEX的類型值,爲什麼這個獨特的索引沒有被使用?

回答

2

您的表沒有足夠的行來使用索引。它們適合於單個磁盤頁面,因此使用cpu時間讀取整個行和過濾行的速度要快於對同一個事物執行兩次(一次用於索引,另一次用於數據)。

+0

這就是發生了什麼事。我使用數百萬個假行填充了表以進行測試,解釋使用了所有內容的索引!我喜歡postgres! –

相關問題