对PostgreSQL中 index only scan 的初步理解

开始

所谓index only scan ,就是因为 建立 index时,所包含的字段集合,囊括了我们 查询语句中的字段,这样,提取出相应的 index ,就不必再次提取数据块了。

例子:

postgres=# \d gaotab;
           Table "public.gaotab"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(20) | 
 deptno | integer               | 
 age    | integer               | 

postgres=# create index idx_id_dept on gaotab(id,deptno);
CREATE INDEX
postgres=# analyze gaotab;
ANALYZE
postgres=#



postgres=# explain select id,deptno from gaotab where id=200;
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Index Only Scan using idx_id_dept on gaotab  (cost=0.00..8.27 rows=1 width=8)
   Index Cond: (id = 200)
(2 rows)

为了抵消cache 的影响,重新执行 explain analyze

postgres=#  explain analyze select id,deptno from gaotab where id=200;
                                                        QUERY PLAN              
                                           
--------------------------------------------------------------------------------
-------------------------------------------
 Index Only Scan using idx_id_dept on gaotab  (cost=0.00..8.27 rows=1 width=8) (
actual time=30.912..30.915 rows=1 loops=1)
   Index Cond: (id = 200)
   Heap Fetches: 1
 Total runtime: 47.390 ms
(4 rows)

postgres=# 

再看看查询中有 index 不包含的字段的情况:

[作者:技术者高健@博客园  mail: luckyjackgao@gmail.com ]

postgres=# explain select id,name from gaotab where id=200;
                                QUERY PLAN                                 
---------------------------------------------------------------------------
 Index Scan using idx_id_dept on gaotab  (cost=0.00..8.27 rows=1 width=10)
   Index Cond: (id = 200)
(2 rows)


postgres=# explain analyze select id,name from gaotab where id=200;
                                                      QUERY PLAN                
                                       
--------------------------------------------------------------------------------
---------------------------------------
 Index Scan using idx_id_dept on gaotab  (cost=0.00..8.27 rows=1 width=10) (actu
al time=47.043..47.044 rows=1 loops=1)
   Index Cond: (id = 200)
 Total runtime: 63.506 ms
(3 rows)

postgres=# 

在这里,我们必须要注意的一点是:

如果是那种 带 where 条件的,如果 前面用了 explain ,后面又对同一条语句用 explain analyze 的话,就会受到缓存的影响。

这样就不够准确了。

例如:

postgres=#  explain select id,deptno from gaotab where id=200;
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Index Only Scan using idx_id_dept on gaotab  (cost=0.00..8.27 rows=1 width=8)
   Index Cond: (id = 200)
(2 rows)

postgres=#  explain analyze select id,deptno from gaotab where id=200;
                                                       QUERY PLAN               
                                         
--------------------------------------------------------------------------------
-----------------------------------------
 Index Only Scan using idx_id_dept on gaotab  (cost=0.00..8.27 rows=1 width=8) (
actual time=0.000..0.000 rows=1 loops=1)
   Index Cond: (id = 200)
   Heap Fetches: 1
 Total runtime: 0.006 ms
(4 rows)

postgres=# 

学习

posted @ 2012-11-07 16:30  健哥的数据花园  阅读(2834)  评论(0编辑  收藏  举报