unique是什么意思啊oracle(如何看懂oracle执行计划(上))

1.以PLSQL为例:

①:配置要在执行计划中显示的项目:

工具->首选项->窗口类型->调度窗口->根据需要配置要在执行计划中显示的列。



执行计划的公共列字段说明:

Rows):Oracle估计当前操作的返回结果集中的行数。

Bytes:执行此步骤后返回的字节数。

成本,CPU成本:Oracle估算的这一步的执行成本,用来解释SQL执行的成本。理论上,越小越好(这个值可能与实际值不同)

时间:Oracle为当前操作估计的时间。

②:打开执行计划:

在SQL窗口中执行select语句后,按F5查看刚刚执行的查询语句的执行计划。



unique是什么意思啊

注意:如果使用SQL命令来查看PLSQL中的执行计划,PLSQL无法支持某些SQL*PLUS命令,例如SET AUTOTRACE ON。



其次,了解Oracle执行计划



①:执行顺序:

从操作的缩进来看,最缩进的先执行;(当缩进相同时,首先执行最上面的一个)

示例:上图中,索引范围扫描和索引唯一扫描两个动作缩进最多,先执行顶部索引范围扫描;

在同一级别,如果一个动作没有子ID,它将首先执行。

同级动作要按照上、右、先的原则执行。

示例:上图中,全局索引ROWID访问表和索引ROWID访问表两个动作的缩进在同一级别,所以先执行位于上方的全局索引ROWID访问表动作;该动作还包含子动作索引范围扫描,则首先执行位于右侧的子动作索引范围扫描;

图中的SQL执行顺序如下:

索引范围扫描-->按全局索引ROWID访问表-& gt;索引唯一扫描-->按索引ROWID访问表-& gt;嵌套循环外部-& gt;分组排序依据—& gt;SELECT语句,目标=所有行

(注意:PLSQL提供了检查执行顺序的功能按钮(上图中的红框))

②:图中动作的一些说明:

1.上图中的表访问方式描述了执行动作时表访问(或Oracle访问数据)的方式;

几种访问表的方法:(并非全部)

  • 全表(全表扫描)

  • 按ROWID的表访问(通过ROWID的表访问)

    通过索引扫描访问

    (1)表访问已满:

    Oracle将读取表中的所有行,并检查每一行是否满足SQL语句中的Where限制;

    多块读取(即一个I/O读取多个数据块)可用于全表扫描,以提高吞吐量;

    使用建议:对于数据太多的表,不建议进行全表扫描,除非有大量的数据要取,占表总数据的5% ~ 10%甚至更多。

    (2)按ROWID进行的表访问:

    先说ROWID。



    ROWID是Oracle自动添加到表中每行最后一列的伪列。由于它是伪列,这意味着ROWID的值不会物理存储在表中。

    您可以像使用其他列一样使用它,但不能添加、删除或更改此列的值。

    一旦插入一行数据,其对应的ROWID在该行的生命周期中是唯一的,即使该行被迁移,该行的ROWID值也不会改变。

    让我们回到按ROWID访问表:

    行的ROWID表示数据文件、数据块以及行在块中的位置,因此ROWID可以快速定位目标数据,这也是Oracle中访问单行数据的最快方式。

    (3)通过索引扫描进行的表访问:

    在索引块中,存储了每个索引的键值和包含键值的行的ROWID。

    对数字列进行索引后,索引的可能概念结构如下:



    所以索引扫描实际上分为两步:

    I:扫描索引以获取相应的ROWID

    Ii:通过定位到具有ROWID的特定行来读取数据

    -索引扫描扩展-。

    有五种扫描方式:

  • 唯一扫描(索引唯一扫描)

  • 索引范围扫描(索引范围扫描)

    索引扫描(索引全扫描)

    索引快速全扫描

    索引跳过扫描(索引跳过扫描)

    a)索引唯一扫描:

    对于唯一索引扫描,最多只能返回记录;

    当表中某个字段存在唯一主键约束时,Oracle往往会实现唯一扫描。

    b)索引范围扫描:

    使用索引访问多行数据;

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

  • 范围运算符用于唯一索引列(例如,> & lt& lt& gt& gt= & lt=之间)

  • 在复合索引上,只有一些列用于查询(前导列必须包含在查询中,否则将扫描整个表)。

    对非唯一索引列的任何查询

    c)索引全扫描:

    执行全索引扫描时,所有被查询的数据都必须直接从索引中获取(注意,全索引扫描只在CBO模式下有效)

    -延伸阅读:Oracle优化器简介。

    Oracle中的优化器是SQL分析和执行的优化工具,负责生成和制定SQL执行计划。

    Oracle有两种优化器:

  • RBO(基于规则的优化)基于规则的优化器

  • CBO(基于成本的优化)基于成本的优化器

    RBO:

    RBO有严格的使用规则。只要你按照这套规则写SQL语句,无论数据表里的内容是什么,都不会影响你的执行计划。

    换句话说,RBO对数据“不敏感”,这需要SQL编写人员知道所有细节;

    RBO一直使用到ORACLE 9i,从ORACLE 10g开始,RBO被完全抛弃了。

    CBO:

    CBO是比RBO更合理、更可靠的优化器,它完全取代了ORACLE 10g中的RBO。

    CBO计算各种可能的执行方案的“成本”,即费用,选择费用最低的执行方案作为实际操作方案;

    它依赖于数据库对象的统计信息。统计信息准确与否会影响CBO做出最佳选择,即对数据“敏感”。

    -

    d)索引快速全扫描:

    扫描索引中的所有数据块类似于索引全扫描,但一个显著的区别是它不对查询的数据进行排序(也就是说,数据不按排序顺序返回)。

    e)索引跳过扫描:

    Oracle 9i以后可用,有时候复合索引的前导列(索引包含的第一列)不出现在查询语句中,oralce也会使用复合索引,然后使用索引跳过扫描;

    何时会触发步进跳过扫描?

    前提:表有复合索引,查询时有除前导列(索引中的第一列)以外的其他列作为条件,优化器模式为CBO。

    当Oracle发现前导列中的唯一值数量较少时,它会将每个唯一值作为例行扫描的入口,然后在此基础上做一次搜索,最后合并这些查询。

    示例:

    假设emp表有三个字段:e name(雇员姓名)、job(职位名称)和sex,并建立了一个复合索引,如在EMP(性别、ename、job)上创建索引IDX _ EMP。

    因为性别只有'男性'和'女性'两个值,为了提高索引的利用率,Oracle可以将这个复合索引拆分为('男性',ename,job)和('女性',ename,job)。

    当查询select * from EMP where job = ' programmer '时,查询发出后:

    Oracle先输入性别为'男性'的入口,然后用复合索引('男性',ename,job)找到job = '程序员'的入口;

    然后输入性别为'女性'的入口,再用复合索引('女性',ename,job)找到job = '程序员'的入口;

    最后,合并来自两个门户的查询结果集。

    您可以还会对下面的文章感兴趣

    使用微信扫描二维码后

    点击右上角发送给好友