当前位置: 首页 > news >正文

基于Oracle的SQL优化--学习(二)

优化器的基础知识

      1、优化器的模式

        Oracle中,优化器的模式是由参数OPTIMIZER_MODE的值来决定的。

        1、RULE:表示Oracle将使用RBO来解析目标SQL,此时SQL中涉及的各个对象的统计信息对于RBO没有任何作用。

        2、CHOOSE:Oracle 9i的默认值,表示在解析目标SQL时使用RBO还是CBO取决于SQL涉及的表对象是否有统计信息。

   3、FIRST_ROWS_n(n=1,10,100,1000):此时CBO计算SQL的各条执行路径的成本值时的侧重点在于以最快的响应速度返回头n(n=1,10,100,1000)条记录。当选择这条记录的时候Oracle会修改执行步骤的成本值,修改为一个很小的值,从而达到不违背CBO原则的目的。

   4、FIRST_ROWS:Oracle 9i中就已经过时的参数,当一些特殊情况下的时候,会使用RBO中的一些内置的规则来选取执行计划不再考虑成本。

   5、ALL_ROWS:Oracle 10g及以后版本中OPTIMIZER_MODE的默认值,表示使用CBO解析目标SQL,此时CBO计算SQL的各条执行路径的成本值时的侧重点在于最佳的吞吐量(即最小的系统I/O和CPU资源的消耗量)。

  2、结果集

    指包含指定执行结果的集合。对RBO来说,对应的执行计划中没有对相关执行步骤对应的结果集的描述,虽然结果集的概念对RBO也是适用的。

  3、访问数据的方法

    访问数据的方法分为两种:直接访问表;先访问索引,再回表。

    直接访问表:

    1、全表扫描:指Oracle访问目标表里的数据时,会从该表所占用的第一个区(Extent)的第一个块(Block)开始扫描,一直扫描到该表的高水位线(HWM),这段范围内所有的数据块都必须读到。

          2、ROEID扫描:指Oracle访问目标表里的数据时,直接通过数据所在的ROWID定位并访问这些数据。ROWID表示Oracle中的数据行记录所在的物理存储地址,也就是说ROWID实际上和Oracle中数据块里的行记录一一对应的。

ROWID扫描有两层含义:一种是根据用户在SQL语句中输入的ROWID的值直接访问对应的数据行记录;另外一种是先访问相关的索引,然后根据访问索引后得到的ROWID再回表访问对应的数据行记录。
对Oracle堆表而言,通过Oracle内置的ROWID伪列得到对应航记录所在的ROWID的值(注意:ROWID只是一个伪列,在实际的表块中并不存在该列),然后还可以根据DBMS_ROWID包中的相关方法(dbms_rowid.rowid_relative_fno、dbms_rowid.rowid_block_number和dbms_rowid.rowid_row_number)将上述ROWID伪列的值翻译成对应数据行的实际物理存储地址。

   访问索引的方法:

    1、索引唯一性扫描:INDEX UNIQUE SCAN,仅适用于where条件中是等值查询的目标SQL。因为扫描的对象是唯一性索引,所以索引唯一性扫描的结果至多只会返回一条记录。

         2、索引范围扫描:INDEX RANGE SCAN,当扫描的对象是唯一性索引时,目标SQL的where条件一定是范围查询(谓词条件为BETWEEN、<、>等);当扫描的对象是非唯一性索引时,对目标SQL的where条件没有限制(可以是等值查询,也可以是范围查询)。在同等条件下,当目标索引的索引行的数量大于1时,索引范围扫描所耗费的逻辑读至少会比相应的索引唯一性扫描多1。

         3、索引全扫描:指要扫描目标索引所有叶子块的所有索引行。但并不意味着需要扫描该索引的所有分支块。默认情况下,Oracle在做索引全扫描时只需要通过访问必要的分支块定位到位于该索引最左边的叶子块的第一行索引行,就可以利用该索引叶子块之间的双向指针链表,从左至右依次顺序扫描该索引所有叶子块的所有索引行了。按照索引键值顺序排序,即可达到排序的效果。避免真正的排序。默认情况下,索引全扫描的有序性就决定了所以全扫描不能并行执行,通常使用单块读。做索引全扫描的前提条件是目标索引至少有一个索引键值列的属性是NOT NULL。

        4、索引快速全扫描:INDEX FAST FULL SCAN,需要扫描目标索引所有叶子块的所有索引行。与索引全扫描的区别:

        (1)、索引快速全扫描只适用于CBO。
        (2)、索引快速全扫描可以使用多块读,也可以并行执行。
        (3)、索引快速全扫描结果不一定是有序的。因为索引快速全扫描时Oracle是根据索引行在磁盘上的物理存储顺序来扫描,而不是根据索引行的逻辑顺序来扫描的。所以扫描结果才不一定有序(对于单个索引叶子块中的索引行而言,其物理存储顺序和逻辑存储顺序一致,但对于物理存储位置相邻的索引叶子块而言,块与块之间索引行的物理存储顺序则不一定在逻辑上有序。
        5、索引跳跃式扫描:INDEX SKIP SCAN,它使那些在where条件中没有对目标索引的前导列指定查询条件但同时又对该索引的非前导列指定了查询条件的目标SQL依然可以用上该索引,这就像在扫描该索引时跳过了它的前导列。这是因为Oracle帮你对该索引的前导列的所有distinct值做了遍历。Oracle中的索引跳跃式扫描仅适用于那些目标索引前导列的distinct值数量较少,后续非前导列的可选择性又非常好的情形,因为索引跳跃式扫描的执行效率一定会随着目标索引前导列的distinct值数量的递增而递减。






相关文章:

  • MySQL案例-show fileds from 提示无权限
  • B+树的数据结构理解
  • 基于Oracle的SQL优化--学习(三)
  • 打 spice 的 deb 格式安装包的时遇到的问题和解决方法
  • 基于Oracle的SQL优化--学习(四)
  • 基于Oracle的SQL优化--学习(五)
  • 基于Oracle的SQL优化--学习(六)
  • (转载)hibernate缓存
  • 基于Oracle的SQL优化--学习(七)
  • 基于Oracle的SQL优化--学习(八)
  • MySQL数字类型中的三种常用种类【转】
  • linux mmap 内存映射【转】
  • 基于Oracle的SQL优化--学习(九)
  • 基于Oracle的SQL优化--学习(十)
  • 在linux下,安装python3.5.2
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 10个确保微服务与容器安全的最佳实践
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • C++入门教程(10):for 语句
  • Git 使用集
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Node项目之评分系统(二)- 数据库设计
  • React Transition Group -- Transition 组件
  • React组件设计模式(一)
  • Swift 中的尾递归和蹦床
  • Xmanager 远程桌面 CentOS 7
  • 排序算法之--选择排序
  • 如何实现 font-size 的响应式
  • 消息队列系列二(IOT中消息队列的应用)
  • 一些css基础学习笔记
  • 2017年360最后一道编程题
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)(1.13) SiK无线电高级配置(五)
  • (23)Linux的软硬连接
  • (C语言)共用体union的用法举例
  • (Oracle)SQL优化技巧(一):分页查询
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十一)手动添加用户和文件的特殊权限
  • (四)鸿鹄云架构一服务注册中心
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net的socket示例
  • .NET值类型变量“活”在哪?
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • []FET-430SIM508 研究日志 11.3.31