8.1 tableaccess full
TABLE ACCESS FULL 全表扫描,多块读,等待事件:db file scattered read
如果是并行全表扫描,等待事件:direct path read
11g 有个新特征,在进行全表扫描的时候也会产生direct path read
在OLTP环境中要通过 10949event禁止该新特征
在OLAP环境中可以不用禁止
如果表上面有大量的行迁链接,会是单块读等待事件表现为db filesequential read
如果表上面发生了一个大事物,全表扫描会从UNDO读取前镜像,也会是单块读
HINT: FULL(表名/别名)
提问:假设test表有10GB的数据如果没有索引是不是走全表扫描??
select id from test where owner='SYS';
全表扫描是只扫描id和 owner列还是全扫??是不是 10GB的数据全部扫一遍??
高水位下的都扫对吧??这个时候可以看是不是碎片太多了??是不是经常DML碎片就多??
如果是并行全表扫描,等待事件:direct path read
8.2 rowidscan
ROWID SCAN 根据ROWID取得数据都是单块读
TABLEACCESS BY USER ROWID 直接用ROWID取得数据比如 whererowid='xxxxxx'
TABLEACCESS BY INDEX ROWID 通过索引的ROWID获得数据
提问:为什么通过ROWID回表是单块读??
ROWID是不是一条数据为了读一条数据读多个块合理吗??一个ROWID对应一个块
当然一个ROWID可能对应多个块行迁移
8.3 indexunique scan
INDEX UNIQUE SCAN 索引唯一扫描。单块读只可能发生在unique index/primary key等值查找
等待事件:db filesequential read但是你几乎看不到,因为只读一条数据
HINT 无需指定,有索引会自动走INDEXUNIQUE SCAN
OLAP这个很少见数据仓库不要主键一般不要建索引不然插入数据很慢
8.4 indexrange scan