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

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

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

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

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

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

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

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

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

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

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

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

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

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

定义和目的

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

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

关键概念和术语

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

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

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

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

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

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

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

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

image.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);

image.png

使用 Oracle SQL 开发人员工具

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

image.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';

分步计划解释

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

问题

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

image.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);

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

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

一般优化策略

索引

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

查询重写

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

执行计划缓存

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

最佳实践

索引策略

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

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

查询设计

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

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

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

执行计划分析

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

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

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

明智地使用查询提示

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

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

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


目录
相关文章
|
19天前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
6天前
|
SQL
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
|
1天前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
12天前
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
2天前
|
SQL
【YashanDB知识库】过期统计信息导致SQL执行计划变差
【YashanDB知识库】过期统计信息导致SQL执行计划变差
|
27天前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
38 1
|
1月前
|
SQL
【YashanDB 知识库】使用 leading hint 调整 SQL 执行计划后报错 YAS-04522 invalid hint leading
在 YashanDB 的所有版本中,使用 leading hint 调整 SQL 执行计划时可能出现“YAS-04522 invalid hint leading”错误,导致 SQL 无法正常执行。原因是 YashanDB 优化器的 Bug。解决方法为避免使用 leading hint。可通过创建测试表 a、b、c 并执行特定 SQL 语句来验证问题是否存在。
|
16天前
|
SQL
【YashanDB知识库】收集分区表统计信息采样率小于1导致SQL执行计划走偏
【YashanDB知识库】收集分区表统计信息采样率小于1导致SQL执行计划走偏
|
1月前
|
SQL 存储 关系型数据库
MySQL原理简介—10.SQL语句和执行计划
本文介绍了MySQL执行计划的相关概念及其优化方法。首先解释了什么是执行计划,它是SQL语句在查询时如何检索、筛选和排序数据的过程。接着详细描述了执行计划中常见的访问类型,如const、ref、range、index和all等,并分析了它们的性能特点。文中还探讨了多表关联查询的原理及优化策略,包括驱动表和被驱动表的选择。此外,文章讨论了全表扫描和索引的成本计算方法,以及MySQL如何通过成本估算选择最优执行计划。最后,介绍了explain命令的各个参数含义,帮助理解查询优化器的工作机制。通过这些内容,读者可以更好地理解和优化SQL查询性能。

热门文章

最新文章

推荐镜像

更多