Oracle数据库全表扫描详解(二)

作者简介:惠星星,现就职于北京海天起点,持有OCP 10g、OCP 11g、OCM 11g证书,并有长达8年电力行业业务维护、数据库维护服务经验,擅长Oracle数据库性能优化、故障处理及数据可视化技术研究。

疑惑不解

问题1: Oracle进行全表扫描时会进行哪些操作,具体有哪些IO(物理IO、逻辑IO)?(已解决)

问题2:、10046 中数据查询(物理IO:6), strace监测中物理IO为3,为啥是6次或3次物理IO,每步做了哪些操作?

问题3:单块读和多块读性能差别多少?如果单块读耗时1us,单次多块(16数据块)读耗时16us,多块读是否能提升性能?

问题4:全表扫描查询,有哪些优化方法?

接着上篇的问题继续分析问题2。

拨开云雾

检查10046 文件

从10046详细执行过程可以发现主要的等待事件为SQL*Net message to client、SQL*Net message from client、Disk file operations I/O、db file sequential read、db file scattered read,等待事件解释如下,本节我们重点关注后面3个IO相关等待事件,分析过程如下,

步骤1: 等待打开数据文件

Disk file operations I/O: 该等待事件表示等待打开IO,FileOperation:file open , filetype:data file,等待时间121微秒,对象object_id: 87775

步骤2: 单块读段头块

db file sequential read:该等待事件表示单块读,等待时间22微秒,file_id: 10,block_id: 130,读取1个块,对象object_id: 87775,该操作读取段头块。

–查询段头块

步骤3: 多块读4个数据块

db file scattered read: 该等待事件表示多块读,多块读数量由db_file_multiblock_read_count决定。

步骤4: 单块读1个数据块

该操作单块读,读取1个数据块。

优化步骤4,减少IO次数

–收集统计信息

–查询extent信息

–查询段头块

–修改多块读参数

猜测48个数据块,一个多块读解决问题?

查看strace数据文件读写部分,

实验失败,说好的一个多块读解决战斗,结果运行6次多块读IO,读段头块操作还是1次单块读IO。

问题5: 观察到该表现在有6个区,是否逐个多块读数据块并且多块读不能跨extent

测试问题5

设置alter system set db_file_multiblock_read_count=7,查看IO情况,

从以上测试结果,验证全表扫描逐个extent多块读数据块并且多块读不能跨extent

云开月明

问题2回溯:

等待打开IO–>单块读段头块–>多块读数据块(4 blocks)–>单块读数据块(1 blocks)

所以物理IO次数应该为3次。这里有一个疑问,单块读段头块目的?

图解全表扫描

下图从IO访问的角度,图解全表扫描操作,

经验小结

  1. 全表扫描先读段头块(1个物理IO),逐个extent多块读数据块。
  2. 多块读不能跨extent。
  3. db file sequential read等待事件是单块读,db file scattered read等待事件是多块读。

问题来了

问题1(已解决): Oracle全表扫描时会进行哪些操作,具体有哪些IO(物理IO、逻辑IO)?

问题2(已解决): 10046 中数据查询(物理IO:6), strace监测中物理IO为3,是6次或3次物理IO,这是一个问题?

问题3(已解决):是否逐个extent多块读数据块并且多块读不能跨extent。

问题4:sread(单块读)和mread(多块读)性能分析?

问题5:sread段头块目的?

问题6:全表扫描查询,有哪些优化方法?

以上问题待下节分析。

未经允许不得转载:Oracle一体机用户组 » Oracle数据库全表扫描详解(二)

相关推荐