Oracle执行计划优化SPM案例

2024-04-18 03:52

本文主要是介绍Oracle执行计划优化SPM案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.现象

执行下面这段代码,发现子库存表走了全表扫描

SELECT msi.secondary_inventory_name, --子库存msi.description --库存说明FROM inv.mtl_secondary_inventories msi,csi_item_instances            ciiWHERE msi.secondary_inventory_name = cii.inv_subinventory_nameAND msi.secondary_inventory_name IS NOT NULL

在这里插入图片描述
子库存表里面的索引
在这里插入图片描述
于是我们加上库存组织后再进行查询
在这里插入图片描述
仍旧是全表扫描
这时我们使用hint语法,强制走索引
在这里插入图片描述

2.确认hint文实际生效

我们在客户端按F5,显示的是解释计划,如果我们要看真正的执行计划,需要使用xplan方法

SELECT /*TOTO20210526*/ /*+ gather_plan_statistics */
/*+ index(msi MTL_SECONDARY_INVENTORIES_U1)*/msi.secondary_inventory_name, --子库存msi.description --库存说明FROM inv.mtl_secondary_inventories msi,csi_item_instances            ciiWHERE msi.secondary_inventory_name = cii.inv_subinventory_name--and msi.organization_id=cii.inv_organization_id

我们使用魔术注释,然后查询下面SQL

SELECT t.*FROM v$sql s,table(DBMS_XPLAN.DISPLAY_CURSOR(s.sql_id, s.child_number)) tWHERE sql_text LIKE '%TOTO20210526%';

在这里插入图片描述
可以看到确实走了索引。但是使用hint,只是告诉了成本优化器要这么做。此时一种方法是直接改写代码中的sql加上这个hint,然后重新部署上线。第二种方法就是利用SPM固定带有hint的执行计划。

3.查询计划基线

即使在xplan中显示已经使用了索引,但是除非是该计划基线已经被固定,否装不会使用该执行计划
我们打开一个新窗口,执行下面语句,捕获计划

alter session set optimizer_capture_sql_plan_baselines =true;

执行查询语句

SELECT /*TOTO20210526-4*/
/*+ index(msi MTL_SECONDARY_INVENTORIES_U1)*/msi.secondary_inventory_name, --子库存msi.description --库存说明FROM inv.mtl_secondary_inventories msi,csi_item_instances            ciiWHERE msi.secondary_inventory_name = cii.inv_subinventory_nameand msi.organization_id=cii.inv_organization_idAND msi.secondary_inventory_name IS NOT NULL

关闭捕获

alter session set optimizer_capture_sql_plan_baselines =false;

查询计划基线

select ENABLED, --    指示计划基准是已启用(YES)还是已禁用(NO)ACCEPTED, --   表示计划基线是否被接受(YES)否(NO)FIXED, --    指示计划基准是否固定(YES)(NO) spb.*from dba_sql_plan_baselines spb;

在这里插入图片描述
上图sql_text内容就是我们的SQL文本
查询该计划基线对应的执行计划,将SQL_HANDLE传入

select * from table(dbms_xplan.DISPLAY_SQL_PLAN_BASELINE('SYS_SQL_b06e9c3ae9259fe3'));

在这里插入图片描述
可以看出已经使用了索引,上图有一个Plan hash value: 1786343847
我们也可以执行下列查询

select * from V$SQL_PLAN s where s.PLAN_HASH_VALUE='1786343847'

4.固定计划基线

我们将sql_handle作为参数,在sysdba角色下执行下列脚本,固定计划基线,优化完成。

declare 
l_plans_altered pls_integer;begin
l_plans_altered:=dbms_spm.alter_sql_plan_baseline(sql_handle      =>'SYS_SQL_b06e9c3ae9259fe3' ,plan_name       =>null ,attribute_name  =>'fixed' ,attribute_value =>'YES' );
end;DECLAREreport CLOB;
BEGINreport := dbms_spm.evolve_sql_plan_baseline(sql_handle => 'SYS_SQL_b06e9c3ae9259fe3');dbms_output.put_line(report);
END;

5.收集统计信息(补充)

很多情况下,没有走理想的索引和计划是由于统计信息过旧导致的,数据库体量允许的情况下,可以重新收集统计信息。
比如此案例中CBO基于错误的或者历史的统计信息,判断子库存表全表扫描速度更快。
收集索引统计信息dbms_stats.gather_index_stats(‘schema’, ‘table_name’);

BEGINdbms_stats.gather_table_stats(ownname          => 'INV',tabname          => 'MTL_SECONDARY_INVENTORIES',estimate_percent => dbms_stats.auto_sample_size,method_opt       => 'FOR ALL COLUMNS SIZE AUTO');
END;

这篇关于Oracle执行计划优化SPM案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913694

相关文章

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

MySQL 复合查询案例详解

《MySQL复合查询案例详解》:本文主要介绍MySQL复合查询案例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录基本查询回顾多表笛卡尔积子查询与where子查询多行子查询多列子查询子查询与from总结合并查询(不太重要)union基本查询回顾查询

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多