• Oracle执行计划


    一、配置执行计划

    Tools—Preferences—Window Types—Plan Window

    二、查看执行计划

    1. 选中代码块
    2. Tools—Explain plan 或者 F5

    1、执行 计划的常用列字段解释

    • 基数(Cardinality) : Oracle 估计的当前操作的返回结果集行数
    • 字节(Bytes) :执行该步骤后返回的字节数
    • 耗费(COST)、CPU耗费: Oracle 估计的该步骤的执行成本,用于说明SQL执行的代价,理论.上越小越好(该值可能与实际有出入)
    • 时间(Time):Oracle估计的当前操作所需的时间

    2、执行顺序

    缩进最多的最先执行; (缩进 相同时,最上面的最先执行)

    三、表访问的几种方式(非全部) 

    • TABLE ACCESS FULL (全表扫描)

    Oracle会读取表中所有的行,并检查每一行是否满足SQL语句中的Where 限制条件;
    使用建议:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多,占到
    表数据总量的5%~ 10%或以上

    • TABLE ACCESS BY NDEX ROWID (通过ROWID的表存取)

    ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不
    会物理存储ROWID的值。
    你可以像使用其它列一样使用它,只是不能对该列的值进行增、删、改操作。
    一旦一行数据插入后,则其对应的ROWID在该行的生命周期内是唯-的,即使发生行
    迁移,该行的ROWID值也不变。

    行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过
    ROWID可以快速定位到目标数据上,这也是Oracle中存取单行数据最快的方法:

    • TABLE ACCESS BY INDEX SCAN (索引扫描)

    在索引块中,既存储每个索引的键值,也存储具有该键值的行的ROWID.

    1、索引扫描实际分两步:

    —扫描索引得到对应的ROWID,
    —通过ROWID定位到具体的行读取数据。

    2、五种索引扫描

    INDEX UNIQUE SCAN (索引唯一扫描):

     针对唯:唯一性索引(UNIQUE INDEX)的扫描,每次至多只返回一条记录;
    表中某字段存在UNIQUE、PRIMARYKEY约束时,Oracle 常实现唯一性扫描

    INDEX RANGE SCAN (索引范围扫描):

    使用一一个索引存取多行数据:

    发生索引范围扫描的三种情况:

    在唯一索引列上使用了范围操作符(如: >, <, <>,  >=, <=, between) ;
    在组合索引上,只使用部分列进行查询(查询时必须包含前导列,香则会走全表扫描);
    对非唯一索引列上进行的任何查询;

    INDEX FULL SCAN (索引全扫描):

    进行全索引扫描时,查询出的数据都必须从索引中可以直接得到;

    INDEX FAST FULL SCAN (索引快速扫描):

    扫描索引中的所有的数据块,与NDEX FULL SCAN类似,但是一个显著的区别是它
    不对查询出的数据进行排序( 即数据不是以排序顺序被返回) ;

    INDEX SKIP SCAN (索引跳跃扫描):

    表有一个复合索引,且在查询时有除了前导列(索引中第一列) 外的其他列作为条件:

     

    四、Oracle优化器

    • RBO (Rule-Based Optimization)基于规则的优化器

    RBO有严格的使用规则,只要按照这套规则去写SQL语句,无论数据表中的内容怎样,
    也不会影响到你的执行计划。换句话说,RBO对数据“不敏感”,它要求SQL编写人员必
    须要了解各项细则。RBO -直沿用至ORACLE 9i,从ORACLE 10g开始,RBO已经彻底
    被抛弃。

    • CBO (Cost-Based Optimization)基于代价的优化器

    CBO是一种比RBO更加合理、可靠的优化器,
    在ORACLE 10g中完全取代RBO. CBO
    通过计算各种可能的执行计划的“代价",即COST,从中选用COST最低的执行方案作为实
    际运行方案。

  • 相关阅读:
    IDEA快捷键
    关于redis key命名规范的设计 【转载】
    Mybatis数据源与连接池 【转载】
    通过缓冲区读文件和非缓冲区读文件有什么区别
    BCB6 使用正则表达式的例子
    QT在子窗口外单击关闭子窗口
    QT5 中文乱码
    QT 鼠标右键菜单
    关于线程池的几个问题
    关于ConcurentHashMap的几个问题
  • 原文地址:https://www.cnblogs.com/baisha/p/15377590.html
Copyright © 2020-2023  润新知