Oracle SQL:了解执行计划和性能调优

news2024/9/21 19:54:14

        查询优化类似于制作完美食谱的艺术——它需要对成分(数据)、厨房(数据库系统)和使用的技术(查询优化器)有深入的了解。每个数据库系统都有自己的处理和运行 SQL 查询的方式,“解释”计划向我们展示了它是如何工作的。通过查看这些计划,我们可以了解优化器所做的选择,并进行改进以加快数据检索速度。

        在 Oracle 数据库中,优化器以其稳健性和复杂性而闻名,通常被描述为基于成本和基于规则的策略的组合。

        在本文中,我们将探讨每个数据库如何生成和利用“解释”计划,重点介绍其方法的优势和潜在缺陷。无论您是数据库开发人员、数据库管理员还是数据分析师,了解这些机制都将使您能够有效地优化查询,确保更快、更可靠的数据检索。

 计划在查询优化中的重要性

        解释计划在使选择查询更快、更高效方面非常有用。从他们那里获得见解和解释也将帮助您优化查询速度和资源使用。

这就是为什么它们如此重要:

  • 性能洞察: 解释计划显示查询运行所遵循的路径。这告诉我们哪些部分真的很慢,以及在哪些方面需要改进。

  • 成本分析:解释计划中的每个操作都有相应的成本;此成本是一个估计值,它被用作执行查询的各种方式中的相对指标。查询成本越低,查询性能越快。

  • 索引利用率: 解释计划告诉我们索引是否被使用以及如何使用它们。正确使用索引可以使查询的处理速度非常快。

  • 加盟策略:解释计划演示如何跨表联接涉及多个表的查询。了解这一点有助于优化表之间的关系。

  • 故障 排除:当查询速度较慢时,解释计划对于了解原因非常重要。事实上,它们准确地显示了问题所在,使其更容易修复。

  • 优化技术:在解释计划中,我们学习了不同的查询优化技术,这些技术有时需要重写、数据库结构更改,甚至配置更改。

定义和目的

        基本上,执行计划是对数据库引擎如何执行查询的分步说明。它概述了操作顺序、将使用的索引以及联接表的方法。由于生成解释计划可能是一个资源密集型过程,因此了解其重要性至关重要。

        解释计划的主要目的是让你深入了解查询的性能。通过分析解释计划,您可以了解数据库在哪些方面可以高效运行,或者在哪些方面可能遇到性能瓶颈。通过这种理解,可以识别和解决潜在问题,从而帮助优化查询以获得更好的性能。

关键概念和术语

  • 执行计划(访问路径):用于执行查询的数据库所遵循的路径。

  • 成本:执行查询所需的资源(如 CPU 和 I/O)的估计值。

  • 操作: 特定的数据库操作,例如从表中读取或执行索引扫描。

  • 行:每个操作将处理的估计行数。

  • 滤波器:行必须满足的条件才能继续查询处理的下一步。

  • Join 方法:使用的联接类型,例如嵌套循环或哈希联接。

  • 字节:提供执行计划中每个操作将处理的数据量(以字节为单位)的估计值。

  • 例图: 查询的 explain plan 输出示例:DB - Oracle: Tool - PLSQL Developer

f44c906003e4f5ea1cb73feb7aac37ef.png

        总之,由于资源消耗减少和查询处理效率更高,降低查询成本通常意味着更快的执行时间。同样,更高的选择性通过更有效地使用索引和减少处理的行数来提高查询性能。

在 Oracle 中生成 Explain Plans

使用 EXPLAIN PLAN

Oracle 中的语句为查询创建执行计划。EXPLAIN PLAN

EXPLAIN PLAN FOR SELECT * FROM员工;

这将创建一个可以查询的计划,用于提供完整视图。DBMS_XPLAN.DISPLAY

使用 DBMS_XPLAN.显示

上面的查询创建了一个可以查询的解释计划,用于提供完整视图。DBMS_XPLAN.DISPLAY

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

d1504cf7bd6314aa73b3c3586c253a06.png

使用 Oracle SQL 开发人员工具

您还可以使用快捷方式通过 SQL 开发人员生成解释计划 – 按 F10。

09bc63aa490cb59cdbce94c2efeca71b.png

实例

让我们看一下客户订单查询。

场景

        联接两个表(订单和客户)的查询由于缺少索引和次优联接方法而运行缓慢。我们将通过添加索引和重写连接来优化查询。

识别慢速查询

SELECT o.order_id, c.full_name

FROM orders o JOIN customers c

ON o.customer_id = c.customer_id

WHERE o.order_status = 'COMPLETE';

分步计划解释

让我们从查询的解释计划开始。

问题

查询执行完整表扫描并使用哈希联接,导致性能下降。

8cf9553c46930a1221bc8f517eb418d6.png

溶液

在查询中标识全表扫描时,请考虑将其替换为索引扫描。首先,检查必要的索引是否已经存在;如果没有,请在子句、条件和子句中使用的列上创建新索引。WHEREJOINORDER BY

让我们首先尝试在连接条件上创建索引,即作为连接和 where 子句一部分的列。

CREATE INDEX customers_idx0 ON customers (customer_id, full_name);

CREATE INDEX orders_idx1 ON orders (customer_id, order_id, order_status);

在创建索引后收集表统计信息对于数据库优化器对查询执行计划做出明智的决策至关重要。让我们收集表格统计数据。

EXEC DBMS_STATS.gather_table_stats(SYS, 'CUSTOMERS');

EXEC DBMS_STATS.gather_table_stats(SYS, ORDERS);

现在让我们在添加这些索引后重新检查执行计划。

d096db51b329e1db57a6d17a38f1c93f.png

    成本从 8 个降低到 6 个,这意味着通过将全表扫描替换为索引快速全扫描和范围扫描,成本降低了 25%。

一般优化策略

索引

    创建索引通常会避免数据扫描,从而使查询运行得更快。正确的索引将使许多查询通过仅查找正确的行来运行。

查询重写

    有时,可以通过重写查询来提高查询性能,使其更有效。通常,可以重写涉及复杂联接或有时涉及子查询的查询,以获得更有效的执行计划。

执行计划缓存

    然后,它缓存计划以重新执行,从而避免了每次创建执行计划的开销。特别是,这允许许多查询使用以前计算的计划。

最佳实践

索引策略
  • 识别和创建索引: 识别运行缓慢的查询。创建适当的索引以加快数据检索速度。对于对多个列进行筛选的查询,请考虑使用复合索引来增强性能。

  • 避免过度索引:过多的索引会降低性能,尤其是 DML。 定期检查并删除未使用或冗余的索引。

查询设计
  • 简化查询: 尽可能将复杂的查询分解为更简单的部分。使用子查询和临时表来管理中间结果。

  • 避免 SELECT *: 在语句中显式指定必需列,以减少数据检索负载。SELECT

  • 适当地使用联接: 选择 s 进行匹配行,仅在必要时选择 s。确保联接条件基于索引列。INNER JOINOUTER JOIN

执行计划分析
  • 定期审查执行计划:使用命令(或等效工具)分析和了解查询执行计划。识别瓶颈和效率低下。EXPLAIN

  • 查找全表扫描: 通过添加索引或重构查询来识别和优化导致全表扫描的查询。

  • 监控成本和基数:注意执行计划中的预估成本和基数,以确保查询路径高效。

 明智地使用查询提示
  • 指导优化器: 当您更好地了解数据和工作负载模式时,使用查询提示来影响优化程序的选择。定期测试和验证提示对查询性能的影响,因为如果数据或工作负载发生更改,它们可能会导致次优计划

        了解和利用解释计划对于优化数据库查询非常重要。通过掌握本文中介绍的技巧和技术,数据库开发人员和管理员都可以大大提高查询性能。这反过来又将提高数据库的整体效率,从而加快响应时间和更有效的数据库管理。通过关注解释计划,您可以轻松识别和解决潜在的性能瓶颈,确保您的数据库以最佳状态运行。

        例如,考虑数据库开发人员/管理员在处理某些关键报告时遇到性能问题的情况。他们可以轻松地在执行计划中识别出昂贵的全表扫描,并将其替换为索引搜索。因此,查询执行时间从几小时缩短到几分钟。这不仅提高了系统的响应能力,还为其他任务释放了资源,展示了利用执行计划的实际好处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1943570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql注意事项(一)

Mysql注意事项(一) 最近回顾了一下MySQL,发现了一些MySQL需要注意的事项,同时也作为学习笔记,记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常,除非你确定需要表中的每个列&am…

每日刷题记录(codetop版)

7.21 7.22 7.23 复习7.21和7.22

每日OJ_牛客DD1 连续最大和

目录 牛客DD1 连续最大和 解析代码 牛客DD1 连续最大和 连续最大和_牛客题霸_牛客网 解析代码 本题是一个经典的动规问题,简称dp问题,但这个问题是非常简单的dp问题,而且经常会考察,所以一定要把这个题做会。本题题意很简单&am…

探寻安全新时代:叉车AI智能影像防撞系统,守护生命之光

在繁忙的工业现场,叉车司机常常面临着视线受阻的困境,那些被货物遮挡的盲区,仿佛隐藏着无法预知的危险。然而,这样的隐患在一次惨痛的事故中暴露无遗,一名无辜的行人因叉车司机的视线受阻而不幸被撞身亡。这起悲剧让我…

机械设计基础B(学习笔记)

绪论 机构:是一些具备各自特点的和具有确定的相对运动的基本组合的统称。 组成机构的各个相对运动部分称为构件。构件作为运动单元,它可以是单一的整体,也可以是由几个最基本的事物(通常称为零件)组成的刚性结构。 构件…

python·数据分析基础知识

numpy 一个数值计算包 python列表与numpy矩阵区别 python中修改列表元素和列表相加 for循环 :[x1 for x in a] 多个元素需要用zip捆绑:[xy for(x,y) in zip(a,b)] numpy矩阵自动进行相应元素计算 np.array()1各元素1 ab各元素相加 a*b矩阵相乘或者是…

爬虫学习4:爬取王者荣耀技能信息

爬虫:爬取王者荣耀技能信息(代码和代码流程) 代码 # 王者荣耀英雄信息获取 import time from selenium import webdriver from selenium.webdriver.common.by import By if __name__ __main__:fp open("./honorKing.txt", "…

C++的UI框架和开源项目介绍

文章目录 1.QT2.wxWidgets3.Dear ImGui 1.QT QT的开源项目:QGIS(地理信息系统) https://github.com/qgis/QGIS?tabreadme-ov-file 2.wxWidgets wxWidgets的开源项目:filezilla https://svn.filezilla-project.org/svn/ wxWidg…

Matplotlib折线图绘制秘籍:让你的数据线条比过山车还刺激!

1. Matplotlib_折线图 折线图(line chart)是我们日常工作中经常使用的一种图表,它可以直观的反应数据的变化趋势 # 导包 import numpy as np import pandas as pd import matplotlib.pyplot as plt# 如果浏览器不显示图片,就需要…

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…

kafka集群搭建-使用zookeeper

1.环境准备: 使用如下3台主机搭建zookeeper集群,由于默认的9092客户端连接端口不在本次使用的云服务器开放端口范围内,故端口改为了8093。 172.2.1.69:8093 172.2.1.70:8093 172.2.1.71:8093 2.下载地址 去官网下载,或者使用如…

达梦索引组织表和堆表

达梦数据库默认创建的是索引组织表,‌而Oracle数据库默认创建的是堆表。‌这两种表类型的区别主要体现在数据存储和组织方式上: 索引组织表(‌Index Organized Table, IOT):‌ 索引组织表‌有且仅有一个聚簇索引键。索引组织表也称“普通表”…

UGUI优化篇--UGUI合批

UGUI合批 UGUI合批规则概述UGUI性能查看工具合批部分的特殊例子一个白色image、蓝色image覆盖了Text,白色image和Text哪个先渲染 Mask合批Mask为什么会产生两个drawcallMask为什么不能合批Mask注意要点 RectMask2D为什么RecMask2D比Mask性能更好主要代码RectMask2D注…

【笔记】学习记录

2024年7月23日 1.图的5中存储方式 2.二叉树的先序,中序,后序遍历。 学了图的存储方式之后,二叉树好像就是小菜一碟一样。注意一下名词的顺序就可以了。 所谓先中后序,就是先根,中根,后根的差别。没有其…

数据库练习-3

查询要求: 查询代码:

Apache2服务介绍

apache2 安装使用配置web访问配置虚拟主机配置代理正向代理反向代理 官网 互联网上排名第一的 HTTP 服务器,Apache HTTP 服务器项目致力于开发和维护适用于现代操作系统(包括 UNIX 和 Windows)的开源 HTTP 服务器。该项目的目标是提供安全、…

【系列教程之】1、点亮一个LED灯

1、点亮一个LED灯 作者将狼才鲸创建日期2024-07-23 CSDN教程目录地址:【目录】8051汇编与C语言系列教程本Gitee仓库原始地址:才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 本源码包含C语言和汇编工程,能直接在电脑中通过Keil…

SQL性能优化秘籍:如何避免计算导致索引失效

适用于MySQL、PostgreSQL、Oracle等各种数据库的优化技巧 问题剖析 设想我们为customer表的c_acctbal列创建了一个B树索引c_acctbal_idx,以加速相关查询。然而,一个看似无害的计算可能会阻碍索引的使用。比如这样的查询: SELECT * FROM cus…

二次元手游《交错战线》游戏拆解

交错战线游戏拆解案 游戏亮点即核心趣味 一、关键词: 回合制游戏、二次元、机甲、横板、剧情、养成、异星探索。 二、游戏亮点: 符合目标群体审美的原画。 三、核心趣味: 抽卡、肝或者氪金解锁新皮肤。 核心玩法及系统规则 核心玩法&…

海外IP代理科普:代理池有什么用?代理池大小的影响

在当今数字化时代,网络爬虫已经成为获取各类信息必不可少的工具。在大规模数据抓取中,使用单一 IP 地址或同一 IP 代理往往会面临抓取可靠性降低、地理位置受限、请求次数受限等一系列问题。为了克服这些问题,构建代理池成为一种有效的解决方…