PostgreSQL index scan,bitmap index scan区别

1. 建表
postgres=# create table tb_index_test(id serial primary key,name character varying);
CREATE TABLE 
postgres=# 
postgres=# \d tb_index_test;
                              Table "public.tb_index_test"
 Column |       Type        |                         Modifiers                          
--------+-------------------+------------------------------------------------------------
 id     | integer           | not null default nextval('tb_index_test_id_seq'::regclass)
 name   | character varying | 
Indexes:
    "tb_index_test_pkey" PRIMARY KEY, btree (id)
 2. 插入测试数据:
 postgres=# insert into tb_index_test values(generate_series(1,10000),'john');
INSERT 0 10000
3. 区别一、启动成本
> index sacn: 因为需要扫描索引块,节点才能输出,索引启动成本大于0
postgres=# explain(analyze,verbose,buffers)select count(0) from tb_index_test where id<400;
                                                                     QUERY PLAN                                                                     
----------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=22.29..22.30 rows=1 width=0) (actual time=0.108..0.108 rows=1 loops=1)
   Output: count(0)
   Buffers: shared hit=6
   ->  Index Scan using tb_index_test_pkey on public.tb_index_test  (cost=0.29..21.29 rows=400 width=0) (actual time=0.016..0.074 rows=399 loops=1)
         Output: id, name
         Index Cond: (tb_index_test.id < 400)
         Buffers: shared hit=6
 Total runtime: 0.140 ms
(8 rows)


Time: 0.620 ms
> bitmap index scan:  因为需要扫描索引块,节点才能放输出,索引启动成本也大于0,但是bitmap index scan的启动成本却是0,可以解释为bitmap Index Scan节点和Bitmap Heap Scan是一对的, 启动成本算在Bitmap Heap Scan上.
postgres=# explain(analyze,verbose,buffers)select count(0) from tb_index_test where id<400;
                                                              QUERY PLAN                                                              
--------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=72.39..72.40 rows=1 width=0) (actual time=0.178..0.178 rows=1 loops=1)
   Output: count(0)
   Buffers: shared hit=6
   ->  Bitmap Heap Scan on public.tb_index_test  (cost=11.38..71.39 rows=400 width=0) (actual time=0.062..0.120 rows=399 loops=1)
         Output: id, name
         Recheck Cond: (tb_index_test.id < 400)
         Buffers: shared hit=6
         ->  Bitmap Index Scan on tb_index_test_pkey  (cost=0.00..11.29 rows=400 width=0) (actual time=0.047..0.047 rows=399 loops=1)
               Index Cond: (tb_index_test.id < 400)
               Buffers: shared hit=3
 Total runtime: 0.217 ms
(11 rows)


Time: 0.741 ms
4. 区别二、节点返回的类型
   index scan: 输出的是tuple,它先扫描索引块,然后得到rowid扫描数据块得到目标记录。
   bitmap index scan; 输出的是索引条目,并不是行的数据,输出索引条目后,交给上一个几点 bitmap heap scan(之间可能将索引条目根据物理排列顺序进行排序)。

 以上参考自 德哥 的教程

5. 区别三、扫描索引块和数据块的区别。
 index scan: 一次只读一条索引项,那么一个 PAGE面有可能被多次访问;
 bitmap index scan : 一次性将满足条件的索引项全部取出,然后交给bitmap heap scan节点,并在内存中进行排序, 根据取出的索引项访问表数据。
参考自: http://francs3.blog.163.com/blog/static/405767272011665227181/

你可能感兴趣的:(PostgreSQL,基础)