全扫描的影响因素之数据舍弃的百分比

来源:互联网 发布:科比数据图 编辑:程序博客网 时间:2024/05/16 16:13
      请记住,全扫描是否为高效的选择取决于需要访问的数据块个数(IO操作)以及最终的结果集行数(舍弃的百分比)。如上一篇‘全扫描的影响因素之数据在数据块中的存储方式’中例子所示,数据的存储返回时在优化器决策的过程中扮演了重要的角色。此外,全扫描是否为高效的选择的另一个关键因素的舍弃。舍弃的行是那些用过筛选谓语(where条件)来进行验证,被证明是不符合条件后从最终的结果集中剔除的数据行。
      在上一篇的例子中,全表扫描运算必须检查表中的所有的10000行数据并舍弃其中的9700行,以得出最终的300行结果集。对于每一行所做的检查就仅仅是筛选谓语id<3。为了执行这个筛选,每一次检查都会使用CPU,这也就意味着尽管需要访问的数据块数目是有限的,为了完成每一行的检查筛选仍需要话费相当多的CPU资源,所以,CPU的使用成本也会归入到全扫描的成本中。

     由上可知,所访问的数据快的数目以及舍弃的数量越大,全扫描的成本也就越高。

   

     上图展示了上一篇例子中的表2的数据行以及数据块的查询。基于所列出的数据块数目,全扫描大约需要访问155个数据块。
     随着时间的推移,新的行被插入到表中使得表更得越来越大,舍弃这么多的数据行的成本也不断增加,到一定程度时优化器将会自动切换到使用索引扫描运算。
     测试:将原来的10000行数据加到1000000行
    > 清空表中的旧数据:
  delete from seq_scan_store_2
    > 修改function:
   create or replace function func_seq_scan_2() returns void as $$      begin        for i in 1..1000000 loop            insert into seq_scan_store_2(sid,name1,name2,name3,name4,name5) values(mod(i,100),'zhansang'||(i/100),'lisi'||(i/100),'wangwu'||(i/100),'zhaoliu'||(i/100),'wangba'||(i/100));        end loop;      end     $$language plpgsql;
    > 插入数据: 
   select func_seq_scan_2();

    > 查看解释计划:

    通过增加数据已经使优化器放弃了全表扫描要使用位图索引扫描,

   此时的该表全部数据所跨越的数据块有11000多个



0 0
原创粉丝点击