ITPub博客

解决Logical Reads高的方法和实验

原创 作者:bisal 时间:2017-08-01 22:17:30 0 删除 编辑

之前介绍了CBC,就是cache buffer chains这个等待事件的影响,《缓解latch: cache buffers chains的案例,解决逻辑读过高的SQL语句,是优化方向。为了更直观地说明这个问题,通过模拟实验,来了解下。


创建测试表,test表三个字段,分别是id1,id2和name,insert入100万行记录,其中id1每个distinct值100次,id2针对每个id1的distinct值,其是唯一的,namedbms_random则是取随机数,


test表总计为127MB,


新建test表id1字段,为非唯一单键值索引,收集表的统计信息,cascade=true,这张表每行平均占用字节108个,


根据id1=1、id2=746,以及name的取值执行SQL,


执行计划中,E-Rows和A-Rows一样,第一步是根据id1索引检索符合条件的rowid键值,根据数据特征,会返回1万条记录,需要回表,根据id2和name字段,过滤检索,返回符合条件的1条记录。相应内存消耗181,


删除原索引,新建id1和id2的复合索引,



执行同一条SQL,E-Rows和A-Rows一样,第一步会根据id1和id2的复合索引,检索出1条记录的rowid,第二步回表检索这个rowid,对应的数据,根据name过滤条件,返回检索。相应内存消耗5,