07 初始 Oracle 优化器
查询优化器,简称优化器,是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了,优化器会参与到SQL语句的解析过程中,用来生成SQL语句的执行计划,直接决定SQL语句执行性能的优劣。
什么是执行计划
在具体介绍优化器之前,我们先普及一下执行计划的概念。
所谓执行计划,是数据库在接收到SQL语句执行请求后,由优化器根据数据库表结构、索引信息以及其他必要信息生成的一个内部数据访问策略,这个策略详细描述了数据库引擎如何将SQL语句转化为一系列的操作步骤,从数据库中获取到最终的执行结果。通过执行计划,我们可以了解到数据库引擎如何访问表、如何使用索引,多表之间如何关联以及相关的其他操作,是数据库性能优化的重要分析工具。
执行计划概览
完整的执行计划主要包括完整的SQL语句、SQL执行计划和谓词信息等几个部分。
SQL_ID g9xaqjktdhbcd, child number 0
-------------------------------------
SELECT employee_id, last_name, first_name, department_name from
employees e, departments d WHERE e.department_id = d.department_id and
last_name like 'T%' ORDER BY last_namePlan hash value: 1219589317
----------------------------------------------------------------------------------------
| Id | Operation | Name |Rows | Bytes |Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 5 (100)| |
| 1 | NESTED LOOPS | | 5 | 190 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 5 | 110 | 2 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | EMP_NAME_IX | 5 | | 1 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | DEPARTMENTS | 1 | 16 | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------3 - access("LAST_NAME" LIKE 'T%')filter("LAST_NAME" LIKE 'T%')4 - filter("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")
以上是一个基础的SQL执行计划,主要包括三个部分:
- SQL语句部分:主要包含SQL_ID,子游标信息和完整的SQL语句;
- 详细的执行计划部分:包括每个步骤所执行的操作方式和操作对象,返回的行数、成本以及所消耗的时间等,当然这些信息是基于统计信息估算出来的;
- 谓词信息:这部分表示的是数据访问时所使用到的关联条件或者过滤条件。细心的同学可能看出来了,上面的执行计划 Id 3 和 Id 4 两个步骤前面有个*号,对应的谓词信息部分有两个步骤所使用到的关联和过滤信息。其中 access 表示数据的访问路径,用于定位数据;filter 表示过滤条件,对上一个操作返回的数据进行筛选。上例 Id 3 的操作对象是EMP_NAME_IX,表示通过索引EMP_NAME_IX访问EMPLOYEES,将满足条件的数据过滤出来;
- 其他部分:对于某些执行计划,还有一些额外的提示内容,如是否使用SQL Profile绑定了执行计划、是否使用了Feedback等等。
如何阅读执行计划
复杂SQL的执行计划也很复杂,通过执行计划来分析数据的访问逻辑并不是一件很轻松的工作,只有掌握了其中的原理才能化繁为简,找出真正的问题所在。
语句的执行顺序
阅读Oracle的执行计划,最基础的原则:执行顺序是从右向左,从上到下。按照这个原则,上面的执行计划中最右边的是 3 INDEX RANGE SCAN,因此这一步最先执行,之后是 2 TABLE ACCESS BY INDEX ROWID,又因为 2 和 4 是平级的,但是 4 在下面,所以 2 执行后接着是 4,二者的数据关联执行 1 NESTED LOOPS。
上述过程用树形图来表示,会更加直观。
表的访问方式
Oracle支持多种方式的单表访问,其中典型访问方式有以下几种类型:
- 全表扫描:数据库引擎扫描表的所有数据块来查找所需要的数据。如果查询的表很大,而返回的结果集又很小,全表扫描是一种很低效的数据获取方式,在OLTP等要求快速响应的系统中,应该尽量减少不必要的全表扫描;
- 索引访问:索引相当于是书本的目录,通过扫描目录获取到详细数据所在的位置,快速获取到所需要的数据。这种方式非常适合从大表中精确定位小的结果集,比全表扫描的效率高。根据索引信息和查询条件的不同,索引扫描又可以分为索引范围扫描、索引快速全扫描、索引跳跃扫描等等,这里限于篇幅的原因,不再展开细说;
- ROWID访问:Oracle数据库中的每一行数据都有精确的家庭住址 – ROWID,这种方式精确定位数据效率是最高的,索引中记录的就是键值和ROWID的对应关系。但是ROWID是一个18位的数字,对于人来说直接使用ROWID并不友好,因此这种方式通常都是系统内部使用。
表的连接方法
如果SQL语句涉及到多张表,需要对多张表进行关联查询,最后返回满足要求的结果集。Oracle主要支持三种类型的连接方法:
- 嵌套循环(Nested Loop):这种方法从外部表结果集中的每一行记录,检索内部表中满足连接谓词的所有数据,由于使用外部表的所有结果集数据和内部表进行匹配,因此外部表也被称为驱动表。这种连接方法适合于用一个小的结果集去驱动大的结果集,对于驱动表数据集较小、而被驱动表相对较大的场景,这种连接方法效率很高;
- 哈希连接(Hash Join):优化器使用两个数据集中较小的一个,基于连接条件列在内存中构建哈希表,然后扫描较大的数据集,探测哈希表以找到符合连接条件的记录。这种方法适用于两个大的结果集之间的等值连接,当较小的结果集能够全部保存在内存中时,这种连接方式的效率非常高,查询成本仅限于对两个数据集进行一次读取。如果数据集不能完全放入内存,优化器会对结果集进行分区,然后逐个分区进行连接匹配;
- 排序合并连接(Sort Merge Join):排序合并连接可以看作是嵌套循环的变种,假如连接中的两个结果集没有排序,优化器会对其进行排序(Sort);之后再基于第一个结果集中的每一行,和第二个结果集进行关联匹配(Merge),得到最终的结果集。这种方法适合于大结果集之间的非等值连接。
三种类型的连接方法各有自己的适用场景和优缺点,需要结合实际运行状态进行选择。如果是小的结果集驱动大结果集,嵌套循环会更适合;如果两个结果集都很大并且是等值连接,使用哈希连接效率更高,因为排序的成本很高;两个大结果集之间的非等值连接使用排序合并,此外,如果结果集大到无法一次性放入内存,使用排序合并的效率也会比哈希连接更高。
前面说的三种方法都是有关联条件的,如果没有关联条件则会使用笛卡尔积连接,这种方法产生的结果集是两个数据集的乘积,如果两个结果集都很大,将会消耗大量的内存和CPU资源。更重要的是由于没有关联条件,这种结果集通常都是无意义的,因此在结果之间要尽量带上关联条件,避免使用笛卡尔积关联。
优化器的分类
Oracle数据库优化器主要分为两大类型:基于规则的优化器(RBO)和基于成本的优化器(CBO)。
RBO,Rule Base Optimizer
RBO 优化器基于一系列设定好的规则来决定 SQL 语句的执行计划。
仍然以前述的 SQL 语句为例,由于在 FROM 子句中,employees 表出现在 departments 表的前面,因此固定由 employees 表来驱动 departments 表。这样做的好处是不需要额外的决策成本,缺点是需要开发人员对于优化器的规则非常了解,才能保证 SQL 语句的执行效率。此外还有一个问题是 RBO 模式下无法解决的,数据总是在不断变化的,当前适合做驱动表不一定意味着永远适合做驱动表,假如某一天 departments 表扩张的比 employees 表还多呢?(不太现实,纯属举例)
CBO,Cost Base Optimizer
因为数据的持续变化,当前的最优未来可能会变成次优。为了让优化器能够生成更准确的执行计划,现代数据库普遍采用 CBO,基于成本的优化器。这种优化器为每种操作设定了数据模型,将表行数、索引页块数量、查询条件的过滤度等值作为变量代入模型中,算出每种执行计划的成本,选择其中成本最低的作为最终执行计划。
CBO 最大的好处是考虑了数据量的变化情况,优化器总是能够根据数据的变化选择最优的执行计划。但成本的计算也是有代价的,对于涉及表和索引非常多的复杂 SQL 来说,决策成本非常的高。(具体可参见本专栏的第一篇文章 01 Oracle基础架构:一条SQL查询语句是如何执行的_在oracle中一条sql是怎么执行的,从硬件层次-CSDN博客 )
此外对于某些 SQL 会由于计算出来的成本非常接近导致执行计划频繁变化,从而影响 SQL 语句的执行性能。针对这些问题 Oracle 引入了一系列的工具,在和执行计划稳定性做着持续不懈的斗争,这个话题以后我们再慢慢展开。
优化器的设置
为了满足不同应用场景的需要,Oracle 的优化器支持多种运行模式。优化器模式受控于 OPTIMIZER_MODE 参数,支持的值有 RULE, CHOOSE, FIRST_ROWS_n(N=1、10、100、1000), FIRST_ROWS 或 ALL_ROWS。每种运行模式的含义概述如下:
-
RULE
表示优化器使用 RBO 来解析目标 SQL 语句,这种模式下 SQL 所涉及的对象统计信息对于执行计划的决策不会起到任何作用。虽然 Oracle 不推荐这种优化器,但是仍然有少数希望 SQL 语句执行绝对稳定的系统在使用这种模式,Ta 们不奢望 SQL 始终选择最好的执行计划,而是期望 SQL 语句能够在可接受的性能范围内稳定的执行;
-
CHOOSE
表示优化器解析 SQL 语句时,选择何种模式取决于相关对象是否有统计信息,只要相关对象含有统计信息,则使用 CBO,否则使用 RBO。这种模式是 9i 的默认设置;
-
FIRST_ROWS_n (n=1、10、100、1000)
表示优化器解析 SQL 语句时,使用 CBO 来解析目标 SQL,优化器在选择执行计划时倾向于以最快的速度返回前 n 条数据。这种模式下优化器会更多的选择 Nested Loop 方式进行表之间关联,对于数据量较大的环境容易出现性能问题,因此除非经过严格的测试,不建议轻易使用该配置;
-
ALL_ROWS
这种模式是 10g 及之后版本的默认值,表示优化器使用 CBO 来解析 SQL 语句,优化器在选择执行计划时倾向于最佳的吞吐量。除非有特别的需求,不建议修改默认的优化器模式。
总结
这篇文章和大家探讨了优化器和执行计划的关系,执行计划是如何工作的,又该如何阅读执行计划。当然,对于 SQL 优化来说,这些知识连入门都谈不上,仅仅是想通过一篇短文来帮助大家建立基本的概念,后续还将推出更多和优化相关的文章,有兴趣的朋友可以持续关注。日常学习和工作中有遇到优化相关的问题,也欢迎随时留言讨论!
相关文章:
07 初始 Oracle 优化器
查询优化器,简称优化器,是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了,优化器会参与到SQL语句的解析过程中,用来生成SQL语句的执行计划,直接决定SQL语句执行性能的优劣。 什么是执行计划 …...
Java对象与XML互相转换(xstream)
依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.18</version></dependency> 实体类 package com.itheima.util;import lombok.AllArgsConstructor; import lom…...
一键生成唯美动漫图:ComfyUI-tPonynai详细搭建教程
tPonynai 是在 C 站上开源的动漫风格扩散模型,与其他基础大模型一样,只需要输入适当的正面和负面提示词就能够实现动漫图片的生成。截至目前已经有 12.9k 的下载量,生成效果也非常不错。本文将介绍ComfyUI-tPonynai在算家云搭建以及本地部署的…...
C++设计模式(工厂模式)
一、介绍 1.动机 在软件系统中,经常面临着创建对象的工作,这些对象有可能是一系列相互依赖的对象;由于需求的变化,需要创建的对象的具体类型经常变化,同时也可能会有更多系列的对象需要被创建。 如何应对这种变化&a…...
多阶段报童问题动态规划求解,Python 实现
使用 python 编写了多阶段报童模型的动态规划算法。 使用了 python 的装饰器 dataclass ,方便定义类尝试使用并行计算,没有成功,极易出错。动态规划中使用并行计算,还是挺有挑战的;而且并行计算不一定总是比非并行运算…...
【C++进阶篇】像传承家族宝藏一样理解C++继承
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...
Java基础面试题09:Java异常处理完成以后,Exception对象会发生什么变化?
一、Java异常(Exception)基本概念 什么是异常? 简单来说,异常就是程序运行时发生了意外的“错误”或者“不正常现象”,导致程序中断。异常处理的目标是让程序在出现问题时能稳住,不会直接崩溃。 1.1 异常…...
mysql sql语句 between and 是否边界值
在 MySQL 中,使用 BETWEEN 运算符时,边界值是包括在内的。这意味着 BETWEEN A AND B 查询会返回 A 和 B 之间的所有值,包括 A 和 B 自身。 示例 假设有一个表 employees,其中有一个 salary 列,您可以使用以下查询&am…...
Java接收LocalDateTime、LocalDatee参数
文章目录 引言I java服务端的实现1.1 基于注解规范日期格式1.2 json序列化和反序列化全局配置自动处理日期格式化II 知识扩展: 枚举的转换和序列化III 签名注意事项引言 应用场景举例:根据时间段进行分页查询数据 前后端交互日期字符串统一是yyyy-MM-dd HH:mm:ss 或者yyyy-M…...
方差分析、相关分析、回归分析
第一章:方差分析 1.1 方差分析概述 作用: 找出关键影响因素,并进行对比分析,选择最佳组合方案。影响因素: 控制因素(人为可控)和随机因素(人为难控)。控制变量的不同水平: 控制变量的不同取值…...
SQLModel入门
SQLModel 系统性指南 目录 简介 什么是 SQLModel?为什么使用 SQLModel? 安装快速入门 定义模型创建数据库和表 基本 CRUD 操作 创建(Create)读取(Read)更新(Update)删除࿰…...
单片机蓝牙手机 APP
目录 一、引言 二、单片机连接蓝牙手机 APP 的方法 1. 所需工具 2. 具体步骤 三、单片机蓝牙手机 APP 的应用案例 1. STM32 蓝牙遥控小车 2. 手机 APP 控制 stm32 单片机待机与唤醒 3. 智能家居系统 4. 智能记忆汽车按摩座椅 四、单片机蓝牙手机 APP 的功能 1. 多种控…...
PostgreSQL在Linux环境下的常用命令总结
标题 登录PgSQL库表基本操作命令新建库表修改库表修改数据库名称:修改表名称修改表字段信息 删除库表pgsql删除正在使用的数据库 须知: 以下所有命令我都在Linux环境中执行验证过,大家放心食用,其中的实际名称换成自己的实际名称即…...
Unity shaderlab 实现LineSDF
实现效果: 实现代码: Shader "Custom/LineSDF" {Properties{}SubShader{Tags { "RenderType""Opaque" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{floa…...
Ubuntu中的apt update 和 apt upgrade
apt update 和 apt upgrade 是 Debian 及其衍生发行版(如 Ubuntu)中常用的两个 APT 包管理命令,它们各自执行不同的任务: apt update: 这个命令用于更新本地软件包列表。当你运行 apt update 时,APT 会从配置的源&…...
Android 中 Swipe、Scroll 和 Fling 的区别
Android 中 Swipe、Scroll 和 Fling 的区别 Swipe(滑动)Scroll(滚动)Fling(甩动)三者之间的区别代码示例 (Fling)总结 在 Android 应用中,Swipe、Scroll 和 Fling 都是用户在触摸屏幕上进行的滑…...
linux基础2
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
如何通过智能生成PPT,让演示文稿更高效、更精彩?
在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…...
执法记录仪数据自动备份光盘刻录归档系统
派美雅按需研发的执法记录仪数据自动备份光盘刻录归档系统,为用户提供数据自动上传到刻录服务端、数据上传后自动归类,全自动对刻录端视频文件大小进行实时监测,满盘触发刻录,无需人工干预。告别传统刻录存在的痛点,实…...
启动SpringBoot
前言:大家好我是小帅,今天我们来学习SpringBoot 文章目录 1. 环境准备2. Maven2.1 什么是Maven2.2 创建⼀个Maven项⽬2.3 依赖管理2.3.1 依赖配置2.3.2 依赖传递2.3.4 依赖排除2.3.5 Maven Help插件(plugin) 2.4 Maven 仓库2.6 中…...
重定向操作和不同脚本的互相调用
文章目录 前言重定向操作和不同脚本的互相调用 前言 声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 重定向操作和不同脚本的互相调用 1.不同脚本的互相…...
51单片机教程(九)- 数码管的动态显示
1、项目分析 通过演示数码管动态显示的操作过程。 2、技术准备 1、 数码管动态显示 4个1位数码管和单片机如何连接 a、静态显示的连接方式 优点:不需要动态刷新;缺点:占用IO口线多。 b、动态显示的连接方式 连接:所有位数码…...
golang支持线程安全和自动过期map
在 Golang 中,原生的 map 类型并不支持并发安全,也没有内置的键过期机制。不过,有一些社区提供的库和方案可以满足这两个需求:线程安全和键过期。 1. 使用 sync.Map(线程安全,但不支持过期) Go…...
机器学习之RLHF(人类反馈强化学习)
RLHF(Reinforcement Learning with Human Feedback,基于人类反馈的强化学习) 是一种结合人类反馈和强化学习(RL)技术的算法,旨在通过人类的评价和偏好优化智能体的行为,使其更符合人类期望。这种方法近年来在大规模语言模型(如 OpenAI 的 GPT 系列)训练中取得了显著成…...
泷羽sec---shell作业
作业一 写计算器 使用bc命令 需要进行安装bc 代码如下: #!/bin/bash echo "-----------------------------------" echo "输入 f 退出" echo "可计算小数和整数" echo "用法如:1.12.2" echo "------…...
华为海思2025届校招笔试面试经验分享
目前如果秋招还没有offer的同学,可以赶紧投递下面这些公司,都在补招。争取大家年前就把后端offer拿下。如果大家在准备秋招补录取过程中有任何问题,都可以私信小编,免费提供帮助。如果还有部分准备备战春招的同学,也可…...
摆脱复杂配置!使用MusicGPT部署你的私人AI音乐生成环境
文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 今天给大家分享一个超酷的技能:如何在你的Windows电脑上快速部署一款文字生成音乐的AI创作服务——MusicGPT,并且通过cpolar内网穿透工具&…...
嵌入式Linux中的GPIO编程
GPIO(General Purpose Input Output)是嵌入式系统中非常常见的一种硬件资源,它允许开发者直接控制微处理器或微控制器的引脚。通过设置这些引脚的状态,可以实现对硬件设备的控制,如LED灯的开关、传感器数据的读取等。 …...
js:函数
函数 函数:实现抽取封装,执行特定任务的代码块,方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词,如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参,实际上写的数据叫实…...
低代码平台审批流程设计
审批流程设计 在此界面设置审批单从发起、到审批、再到结束的流转步骤。 6.1 添加节点 点击两个节点间连线的 图标可添加 审批人、抄送人、办理人、条件分支。 6.2 节点类型 提交节点 点击提交节点,可在右侧弹窗中设置提交节点的抄送人,实现审批在发…...
湖南省建设厅建管处/杭州网站建设方案优化
[Spring]关于IOC控制反转,你应该掌握这些 本文是于2020-4-24重构,将文章中关于Spring的理念介绍移至: 你一直在用Spring,但你可能真的不懂它 本文为IOC的实操部分,介绍Spring的一些基本操作 文章目录[Spring]关于IOC控…...
郑州做网站大量网站被关/企业网页设计制作
圆圈舞蹈 [问题描述] 熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。 奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的…...
免费创造网站/自己怎么制作网站
谢邀。 先提一下,我并没有用IDE写Python的习惯。因为平时主要就写一点数据分析,这些的话我完全可以用VS Code来实现,而PyCharm什么的IDE,毕竟没Editor好用。后来是因为组织有送Visual Studio Enterprise的key,那就恭敬…...
宁波做网站seo的/媒体软文发稿
ASP.NET Core is a significant redesign of ASP.NET. This topic introduces the new concepts in ASP.NET Core and explains how they help you develop modern web apps. Asp.net Core是重新设计过得新一代Asp.Net。此篇文章介绍Asp.net Core 如何帮助你开发先进的web应用…...
公司让做网站违法/十大技能培训机构排名
Apple在 WWDC 上宣布,将向iOS 14.6、iPadOS 14.6、macOS 11.4 和tvOS 14.6及以上的用户提供空间音频和无损音频。 Apple 表示,在发布时将会提供超过 2000 万首无损质量的歌曲,到 2021 年底,整个 Apple Music 目录中将会提供超过 …...
导航网站怎么做seo/奉化网站关键词优化费用
题目链接 没早发现这个DP,一直纠结各种图论题,蛋疼。。无奈水平太菜,最后两个小时都没搞出,本来想开10个标记数组的。。。。搞到最后半小时,发现同颜色的不会算,暴力吧。。。然后有个小细节没搞好ÿ…...