全表扫描是怎么扫描的?
oracle最小的存储单位是block
物理上连续的block组成了extent(也就是说一个区中的所有块在物理上是连续的)
很多个extent组成了segment(一个segment中的区在物理上可能是连续的,也可能是不连续的)
全表扫描是一个区一个区的扫描的,因为一个区内多个块在物理上是连续的,所以可以多块读。
最常用的:set autotrace trace
统计信息的意义:
recursive calls :递归调用的次数(递归调用是指,执行目标sql时,需要执行一些别的sql来为目标sql服务。eg:解析,查数据字典,插入数据字典,或目标sql中调用了用户自定义函数等)
一般一个新的sql执行2-3次以后递归调用次数就为0了,除非sql中有用户自定义函数。-----这个指标在优化中,一般不用过多关注。
db block get:有多少个块被修改了,单位是块(只有dml才能修改块,一个select语句一般情况下,db block get为0,当延迟块清除的时候,select 的 db block get可能不为0【延迟块清除没什么意义,不用过多关注】)
consistent get:逻辑读,一个块在buffer cache中,被扫描一次,逻辑读就+1,逻辑读可能是读不同的块,也可能是一个块读了多次。
【场景demo:如果一个表中好多的块都被修改过,在undo中,因为我们要读undo,还要重新构造镜像块。所以,在一个高并发的dml情景下,select的逻辑读可能要比标准情况下高几倍。】
physical reads:物理读,将一个块从磁盘读到buffer cache,物理读+1. (逻辑读是包含物理读的。)
redo size:跑这个sql产生多少的redo日志。(只要db block get为0,redo size为0)
这两个是网络指标,从服务器发送多少到客户端,从客户端接收了多少,不用过多关注。
sorts(memory)和sorts(disk):内存排序和磁盘排序,优化中基本没用。不用关注。
1 rows processed(这一列是重点非常有用):sql语句处理或返回了多少行,能直观的看出来,这个sql能不能优化。
【【【 重要的,有用的信息:consistent get 和 rows processed 】】】