Oracle数据库性能优化之优化器组件
mhr18 2024-10-07 10:29 21 浏览 0 评论
优化器包含三个组件:转换器,估计器和计划生成器。
下图说明了这些组件。
一组查询块表示已解析的查询,这是优化器的输入。下表描述了优化程序的操作。
步骤 | 执行方式 | 描述 |
1 | 查询转换器 | 优化器确定更改查询的形式是否有帮助,以便优化器可以生成更好的执行计划。 |
2 | 估算器 | 优化器根据数据字典中的统计信息估算每个计划的成本。 |
3 | 计划生成器 | 优化器比较计划的成本,然后选择成本最低的计划(称为执行计划)传递给行源生成器。 |
查询转换器
对于某些语句,查询转换器确定以较低的成本将原始SQL语句重写为语义上等效的SQL语句是否有利。当存在可行的替代方案时,数据库将分别计算替代方案的成本,并选择成本最低的替代方案。下图显示了查询转换器将使用的输入查询重写为使用OR的输出查询UNION ALL。
估算器
所述估计器是确定一个给定的执行计划的总成本的优化器组件。估算器使用三种不同的方法来确定成本:
选择性
- 查询选择的行集中的行百分比,0表示无行,1表示所有行。选择性与查询谓词(例如WHERE last_name LIKE 'A%'或谓词的组合)相关。谓词在选择性值接近时变得更具选择性,而在价值接近时则变得0不那么选择性(或更具非选择性)1。
- 注意:选择性是在执行计划中不可见的内部计算。
基数
- 基数是执行计划中每个操作返回的行数。此输入对于获得最佳计划至关重要,对于所有成本功能都是相同的。估计器可以从收集的表统计信息中得出基数DBMS_STATS,也可以在考虑到谓词(过滤器,联接等)DISTINCT或GROUP BY操作等的影响后得出基数。所述Rows在执行计划列显示了估计的基数。
成本
- 该度量表示使用的工作单位或资源。查询优化器将磁盘I / O,CPU使用率和内存使用率作为工作单位。
如下图所示,如果统计信息可用,则估算器将使用它们来计算度量。统计信息提高了度量的准确性。
对于示以上所示的查询,估算器使用选择性,估算的基数(总返回10行)和成本测度得出其总成本估算为3:
选择性
选择性表示,从行组的一小部分行集可以是基表,视图或联接的结果。选择性与查询谓词(例如last_name= 'Smith')或谓词的组合(例如)相关last_name = 'Smith' AND job_id = 'SH_CLERK'。注意:选择性是在执行计划中不可见的内部计算。
谓词从行集中过滤出特定数量的行。因此,谓词的选择性指示通过谓词测试的行数。选择性范围是0.0到1.0。选择性为0.0表示未从行集中选择任何行,而选择性为1.0表示已选择所有行。谓词在值接近0.0时变得更具选择性,而在值接近1.0时则变得不那么选择性(或更不选择性)。优化程序根据统计信息是否可用来估计选择性:
- 统计资料不可用
根据OPTIMIZER_DYNAMIC_SAMPLING初始化参数的值,优化器将使用动态统计信息或内部默认值。数据库根据谓词类型使用不同的内部默认值。例如,相等谓词(last_name = 'Smith')的内部默认值低于范围谓词(last_name > 'Smith')的内部默认值,因为期望相等谓词返回较小的行部分。
- 可用统计
当统计数据可用时,估计器将使用它们来估计选择性。假设有150个不同的员工姓氏。对于相等谓词last_name = 'Smith',选择性是的n不同值的数量的倒数last_name,在此示例中为0.006,因为查询从150个不同值中选择包含1的行。
如果last_name列上存在直方图,则估计器将使用直方图而不是不同值的数量。直方图捕获了列中不同值的分布,因此它产生了更好的选择性估计,尤其是对于那些具有数据偏斜的列。
基数
基数是由每个操作在执行计划中返回的行的数目。例如,如果优化程序对全表扫描返回的行数的估计为100,则此操作的基数估计为100。基数估计出现在Rows执行计划的列中。优化器基于一组复杂的公式来确定每个操作的基数,这些公式使用表和列级别的统计信息或动态统计信息作为输入。当单个等式谓词出现在单表查询中且没有直方图时,优化器将使用最简单的公式之一。在这种情况下,优化器采用均匀分布,并通过将表中的行总数除以WHERE子句谓词中使用的列中不同值的数量,来计算查询的基数。例如,用户hr查询employees表如下:
SELECT first_name, last_name
FROM employees
WHERE salary='10200';
该employees表包含107行。当前的数据库统计信息表明,该salary列中不同值的数量为58。因此,优化器2使用公式将结果集的基数估计为107/58=1.84。基数估计必须尽可能准确,因为它们会影响执行计划的所有方面。当优化器确定连接成本时,基数很重要。例如,在employees和departments表的嵌套循环连接中,in 的行数employees决定了数据库必须多久探测一次departments表。基数对于确定分类成本也很重要。
成本
成本是表示用于一个计划的估计资源使用的内部数值量度。该费用特定于优化器环境中的查询。为了估算成本,优化器会考虑以下因素:
- 系统资源,包括估计的I / O,CPU和内存
- 估计返回的行数(基数)
- 初始数据集的大小
- 数据分配
- 访问结构
成本是优化程序用来比较同一查询的不同计划的内部度量。您无法调整或更改成本。执行时间是成本的函数,但是成本并不直接等于时间。例如,如果查询A的计划的成本比查询B的计划低,那么可能会有以下结果:
- A的执行速度比B快。
- A的执行速度比B慢。
- A与B的执行时间相同。
因此,无法相互比较不同查询的成本。此外,您无法比较使用不同优化器模式的语义等效查询的成本。
执行计划生成器
执行计划生成器探讨了通过尝试不同的访问路径查询块各种各样的计划,连接方法和连接顺序。由于数据库可以使用多种组合来产生相同的结果,因此可能有许多计划。优化器选择成本最低的计划。下图显示了优化程序测试输入查询的不同计划。
优化器跟踪文件中的以下代码片段显示了优化器执行的一些计算:
GENERAL PLANS
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]: DEPARTMENTS[D]#0 EMPLOYEES[E]#1
***************
Now joining: EMPLOYEES[E]#1
***************
NL Join
Outer table: Card: 27.00 Cost: 2.01 Resp: 2.01 Degree: 1 Bytes: 16
Access path analysis for EMPLOYEES
. . .
Best NL cost: 13.17
. . .
SM Join
SM cost: 6.08
resc: 6.08 resc_io: 4.00 resc_cpu: 2501688
resp: 6.08 resp_io: 4.00 resp_cpu: 2501688
. . .
SM Join (with index on outer)
Access Path: index (FullScan)
. . .
HA Join
HA cost: 4.57
resc: 4.57 resc_io: 4.00 resc_cpu: 678154
resp: 4.57 resp_io: 4.00 resp_cpu: 678154
Best:: JoinMethod: Hash
Cost: 4.57 Degree: 1 Resp: 4.57 Card: 106.00 Bytes: 27
. . .
***********************
Join order[2]: EMPLOYEES[E]#1 DEPARTMENTS[D]#0
. . .
***************
Now joining: DEPARTMENTS[D]#0
***************
. . .
HA Join
HA cost: 4.58
resc: 4.58 resc_io: 4.00 resc_cpu: 690054
resp: 4.58 resp_io: 4.00 resp_cpu: 690054
Join order aborted: cost > best plan cost
***********************
跟踪文件显示优化器首先尝试将该departments表作为联接中的外部表。优化器为三种不同的联接方法计算成本:嵌套循环联接(NL),排序合并(SM)和哈希联接(HA)。优化器选择哈希联接作为最有效的方法:
Best:: JoinMethod: Hash
Cost: 4.57 Degree: 1 Resp: 4.57 Card: 106.00 Bytes: 27
然后,优化器使用employees外部表尝试不同的连接顺序。此连接订单的成本比先前的连接订单高,因此被放弃。当找到成本最低的计划时,优化器使用内部截止来减少尝试的计划数量。截止时间基于当前最佳计划的成本。如果当前的最佳成本很高,则优化器将探索替代计划以找到较低成本的计划。如果当前的最佳成本很小,则优化器会迅速结束搜索,因为进一步的成本改善并不明显。
相关推荐
- 甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入
-
IT之家7月1日消息,根据甲骨文Oracle当地时间6月30日向美国证券交易委员会(SEC)递交的FORM8-K文件,该企业在始于2025年6月1日的202...
- 甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云
-
IT之家6月23日消息,Oracle甲骨文创始人、董事长兼首席技术官LarryEllison(拉里埃里森)在本月早些时候的2025财年第四财季和全财年财报电话会议上表示,Oracle...
- Spring Boot 自定义数据源设置,这些坑你踩过吗?
-
你在使用SpringBoot进行后端开发的过程中,是不是也遇到过这样的问题:项目上线后,数据库连接总是不稳定,偶尔还会出现数据读取缓慢的情况,严重影响了用户体验。经过排查,发现很大一部分原因竟然...
- 一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)
-
今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...
- 低代码建模平台-数据挖掘平台(低代码平台的实现方式)
-
现在来看一下数据连接。·这里是管理数据连接的空间,点击这里可以新增一个数据连接。·输入连接名称,然后输入url,是通过gdbc的方式去连接的数据库,目前是支持mysql、oracle以及国产数据库达梦...
- navicat 17.2.7连接oracle数据库提示加载oracle库失败
-
系统:macOS15.5navicat版本:navicatpremiumlite17.2.7连接oracle测试报错:加载oracle库失败【解决办法】:放达里面找到程序,显示简介里面勾选“使...
- 开源“Windows”ReactOS更新:支持全屏应用
-
IT之家6月17日消息,ReactOS团队昨日(6月16日)在X平台发布系列推文,公布了该系统的最新进展,包括升级Explorer组件,支持全屏应用,从Wine项目引入了...
- SSL 推出采用全模拟内置混音技术的模拟调音台Oracle
-
英国调音台传奇品牌SolidStateLogic宣布推出Oracle——一款采用全模拟内置混音技术的调音台,在紧凑的AWS尺寸机箱内集成了大型调音台的功能。该调音台提供24输入和...
- 47道网络工程师常见面试题,看看有没有你不会的!
-
你们好,我的网工朋友。网络工程师面试的时候,都会被问到什么?这个问题其实很泛,一般来说,你肯定要先看明白岗位需求写的是什么。基本上都是围绕公司需要的业务去问的。但不可否认的是,那些最基础的概念,多少也...
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
-
e公司讯,从汉得信息获悉,近日,微软官方宣布InternetExplorer桌面应用程序将于2022年6月15日正式停用。目前大部分客户都是使用IE浏览器打开EBS的Form界面,IE停用后,只能使...
- 36.9K star ! 推荐一个酷炫低代码开发平台!功能太强!
-
前言最近在逛github,看看能不能搜罗到一些对自己有帮助的开源软件。不经意间看到一个高star的java开源项目:jeecg-boot。进入在线演示版一看,感叹实在是太牛了!此开源项目不管是给来学习...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 手把手教你在嵌入式设备中使用SQLite3
-
摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数...
- JAVA语言基础(java语言基础知识)
-
一、计算机的基本概念什么是计算机?计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行、自动高速处理海量数据的现代化智能电子设备。由硬件和软件组成、没有安装过任何软件的计算机称...
- 再见 Navicat!一款开源的 Web 数据库管理工具!
-
大家好,我是Java陈序员。在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件,基...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入
- 甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云
- Spring Boot 自定义数据源设置,这些坑你踩过吗?
- 一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)
- 低代码建模平台-数据挖掘平台(低代码平台的实现方式)
- navicat 17.2.7连接oracle数据库提示加载oracle库失败
- 开源“Windows”ReactOS更新:支持全屏应用
- SSL 推出采用全模拟内置混音技术的模拟调音台Oracle
- 47道网络工程师常见面试题,看看有没有你不会的!
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)