zoukankan      html  css  js  c++  java
  • oracle学习----访问路径

    什么是访问路径?表扫描数据的时候使用了什么方式,这个方式就是访问路径

    1.全表扫描
    TABLE ACCESS FULL 全表扫描,多块读,等待事件:db file scattered read
    如果是并行全表扫描,等待事件: direct path read
    11g 有个新特征,在进行全表扫描的时候也会产生 direct path read
    在OLTP环境中要通过 10949 event 禁止该新特征
    在OLAP环境中可以不用禁止
    如果表上面有大量的行迁链接,会是单块读 等待事件表现为db file sequential read
    如果表上面发生了一个大事物,全表扫描会从UNDO读取前镜像,也会是单块读
    HINT: FULL(表名/别名)
    等待事件:db file scattered read 在SGA中
    等待事件:direct path read 在PGA中

    禁用oracle11g的新特性,有两种方法
    a.event 10949设置后,可以禁用direct path read。
    开启
    SQL> ALTER session SET EVENTS '10949 TRACE NAME CONTEXT FOREVER';
    禁用
    SQL> ALTER session SET EVENTS '10949 TRACE NAME CONTEXT off';


    b.通过设置隐含参数_serial_direct_read来设置是否启用direct path read
    禁用
    SQL>alter session set "_serial_direct_read"=never;
    开启(默认)
    SQL> alter session set "_serial_direct_read"=auto;

    2.索引唯一扫描
    INDEX UNIQUE SCAN 索引唯一扫描。单块读 只可能发生在unique index/primary key 等值查找
    等待事件:db file sequential read 但是你几乎看不到,因为只读一条数据
    HINT 无需指定,有索引会自动走INDEX UNIQUE SCAN
    索引唯一扫描在不回表的时候访问几个索引块?
    索引高度这么多个块。

     

    select * from t where id=10;返回一行数据,要扫描多少个块?
    索引高度+1(在不发生行迁移连接的情况下)
    索引高度+2(发生行迁移连接的情况)

    3.索引范围扫描
    INDEX RANGE SCAN 索引范围扫描。单块读 发生在对unique index/primary key 进行范围查找,
    对non-unique index进行等值查找,范围查找
    等待事件:db file sequential read 如果你监控某个SQL出现大量该等待事件,
    有可能执行计划就有问题
    HINT: INDEX(表名/别名 索引名)

    在索引唯一扫描中很难捕获等待事件,因为只返回一条数据,单块读的时间为12ms,索引唯一扫描扫描索引高度这么多个块,返回一条数据
    的时间小于1s,1s这个阈值是记录等待时间的要求,所以不会记录等待事件,这个阈值是ash的响应时间,什么是ash呢?
    ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成。
    那么在索引范围扫描中怎么能看见db file sequential read等待事件呢?
    12ms*100等于1.2s超过了ash的阈值,就可以记录等待事件
    100单块读,每个块包含1000条数据,就是10w条数据,也就是说通过索引范围扫描返回超过10w条数据时就会出现等待时间。

    监控一个sql的等待事件
    select (sysdate-logon_time)*24*60 minutes,username,machine,program,action,
    status,inst_id,sid,serial#,event,p1,p2,p3,
    row_wait_obj# obj#,row_wait_file# file#,row_wait_block# block#,sql_id,sql_child_number from gv$session where sql_id='XXX';

    4.索引跳跃扫描
    INDEX SKIP SCAN 索引跳跃扫描。单块读 只可能发生在组合索引上,引导列(组合索引第一列)没有包
    含在where条件中,并且引导列基数很低。INDEX SKIP SCAN
    一般来说只会返回少量数据,如果返回大量数据,说明该执
    行计划可能有问题,也就是说索引建立不对。
    等待事件:db file sequential read
    HINT: INDEX_SS(表名/别名 索引名)

    5.索引全扫描
    INDEX FULL SCAN 索引全扫描。单块读 。它扫描的结果是有序的,因为索引是有序的。它通常发生在
    下面几种情况(注意:即使SQL满足以下情况 不一定会走索引全扫描)
    a. SQL语句有order by选项,并且order by 的列都包含
    在索引中,并且order by 后列顺序必须和索引列顺序一致。
    b. 在进行SORT MERGE JOIN的时候,如果要查询的列通过索
    引就能获得,那就不必进行全表扫描了,另外也避免了排
    序,因为INDEX FULL SCAN返回的结果已经排序。
    c. 当查询中有GROUP BY,并且GROUP BY 的列包含在索引中。
    等待事件:db file sequential read
    HINT: INDEX(表名/别名 索引名)

    索引全表扫描会扫描blevel+leaf个块

    6.索引快速扫描
    INDEX FAST FULL SCAN 索引快速全扫描。多块读 。当SQL要查询的数据能够完全从索引中获得,那么
    Oracle就不会走全表扫描了,就会走索引快速全
    扫描。索引快速全扫描类似全表扫描,它可以多块
    读,并且可以并行扫描。
    等待事件:db file scattered read
    HINT:INDEX_FFS(表名/别名 索引名)

  • 相关阅读:
    作业 20181030-3互评Alpha版本
    Alpha阶段事后诸葛亮会议记录
    Alpha发布用户使用报告
    20181023-2 贡献分配
    作业 20181016-1 Alpha阶段贡献分配规则
    Scrum立会报告+燃尽图(十月三十日总第二十一次)
    OC中时间函数的使用
    OC中的集合详解
    面向对象的概念详解(转)
    集中类
  • 原文地址:https://www.cnblogs.com/SUN-PH/p/4140175.html
Copyright © 2011-2022 走看看