Oracle执行计划优化SPM案例

news2024/10/6 2:30:59

1.现象

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

SELECT msi.secondary_inventory_name, --子库存
       msi.description --库存说明
  FROM inv.mtl_secondary_inventories msi
      ,csi_item_instances            cii
 WHERE msi.secondary_inventory_name = cii.inv_subinventory_name
   AND 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            cii
 WHERE 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)) t
 WHERE 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            cii
 WHERE msi.secondary_inventory_name = cii.inv_subinventory_name
   and msi.organization_id=cii.inv_organization_id
   AND 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;
 
DECLARE
  report CLOB;
BEGIN
  report := 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’);

BEGIN
  dbms_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;

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

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

相关文章

【Linux--多线程】

1 . Linux线程概念 1.1 什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部执行,本质是在进程地址空间内运行 Linux系…

P1157 组合的输出 (dfs深搜)

题目连接&#xff1a;P1157 组合的输出 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; AC代码&#xff1a; #include<iostream> #include<cstring>using namespace std;const int N 30; int st[N];//用来存这个数用没用过&#xff08;1~n个…

第十五届蓝桥杯复盘python大学A组——试题B 召唤数学精灵

按照正常思路解决&#xff0c;由于累乘消耗大量时间&#xff0c;因此这不是一个明智的解决方案。 这段代码执行速度非常慢的原因在于它试图计算非常大的数的阶乘&#xff08;累乘&#xff09;&#xff0c;并且对于每一个i的值都执行这个计算。阶乘的增长是极其迅速的&#xff…

graylog使用Sidecars方式收集springboot程序的日志

1、部署graylog后台服务 使用docker-compose启动三个服务程序&#xff0c;包括graylog、mongodb、opensearch。 docker-compose.yml内容如下 version: 3 services: # MongoDB: https://hub.docker.com/_/mongo/ mongodb: image: mongo:6.0.14 privileged: true …

Mybatis-plus动态数据源

由于服务没有做微服务部署&#xff0c;需要在后台管理系统访问其他服务的库&#xff0c;所以需要用到动态数据源切换 引入依赖 mybatis-plus动态数据源依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot…

掼蛋小技巧(下篇)

一、记断张和单牌 如果我们手上有断张&#xff0c;那么外面有九成概率成炸&#xff1b;我们的单张外面有七张&#xff0c;有七成概率成炸&#xff0c;实战中两家同时断同一张牌的概率很低&#xff0c;所以要时刻关注自己的断张和单张。 二、情况不明&#xff0c;对子先行 对子可…

【进程地址空间】进程的独立性 | 虚拟地址物理地址 | 页表 | 写时拷贝

目录 前言 基本概念 进程的独立性 虚拟地址&物理地址 进程地址空间 页表&#xff08;虚拟地址☞物理地址&#xff09; 写时拷贝 基本理解 地址空间 写时拷贝&#xff08;浅拷贝&#xff09; 数据独立性的保证☞写时拷贝 写时拷贝的优点 图解分析 前言 我们…

MySQL-多表查询:多表查询分类、SQL99语法实现多表查询、UNION的使用、7种SQL JOINS的实现、SQL99语法新特性、多表查询SQL练习

多表查询 1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. 多表查询分类讲解分类1&#xff1a;等值连接 vs 非等值连接等值连接非等值连接 分类2&#xff1a;自连接 vs 非自连接分类3&#xff1a;内连接…

JavaSE图书管理系统实战

代码仓库地址&#xff1a;Java图书管理系统 1.前言 该项目将JavaSE的封装继承多态三大特性&#xff0c;使用了大量面向对象的操作&#xff0c;有利于巩固理解 &#xff08;1&#xff09;实现效果 2.实现步骤 第一步先把框架搭建起来&#xff0c;即创建出人&#xff1a;管理员和…

九、OOP面向对象程序设计(四)

1、this、super、static和final关键字的使用 (1)this关键字的使用 当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量。 把当前对象当作参数传递时,可以用this。 有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名类中用thi…

第20天:信息打点-红蓝队自动化项目资产侦察企查产权武器库部署网络空间

第二十天 一、工具项目-红蓝队&自动化部署 自动化-武器库部署-F8x 项目地址&#xff1a;https://github.com/ffffffff0x/f8x 介绍&#xff1a;一款红/蓝队环境自动化部署工具,支持多种场景,渗透,开发,代理环境,服务可选项等.下载&#xff1a;wget -O f8x https://f8x.io…

从入门到精通C++之类和对象(续)

目录 初始化列表构造函数&#xff1f;拷贝构造&#xff1f;浅谈explicit关键字友元 内部类static成员总结 初始化列表 引入初始化列表&#xff1a;简化代码&#xff0c;提高效率 在编程中&#xff0c;初始化列表是一种用于在创建对象时初始化成员变量的快捷方式。通过初始化列…

神仙级Python入门教程(超级详细),从零基础入门到精通!!

关于Python学习指南 学好 Python 不论是就业还是做副业赚钱都不错&#xff0c;但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料&#xff0c;给那些想学习 Python 的小伙伴们一点帮助&#xff01; 包括&#xff1a;Python激活码安装包、Pyth…

RAG原理详解

什么是RAG 检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;简称RAG&#xff09;为大型语言模型&#xff08;LLMs&#xff09;提供了从某些数据源检索到的信息&#xff0c;以此作为生成答案的基础。简而言之&#xff0c;RAG是搜索LLM提示的结合&#xff0…

新标准日本语 课后练习

自学错误可能较多&#xff0c;听力题不需要听力的就没听录音 第二十課 スミスさんはピアノを弾くことができます 練習&#xff11;&#xff0d;&#xff11; &#xff11;張さんは日本の歌を歌うことができます 张先生会唱日本歌 &#xff12;小野さんは自転車に乗ることがで…

Doris Manager 24.0 版本正式发布!

Cluster Manager for Apache Doris&#xff08;简称 Doris Manager&#xff09;是 SelectDB 推出的管理运维 Apache Doris 集群的工具。用户可以轻松通过该工具部署和接管集群&#xff0c;实时查看集群的运行状态和详情&#xff0c;快捷地对集群进行扩缩容、升级及重启操作。同…

App Inventor 2 计时器组件,时间相关的用法都在这里

1、计时器在界面设计中的哪里&#xff1f; 2、计时器怎么启动&#xff1f; 默认计时器是自动启用的&#xff0c;也可程序控制它的属性“启用计时”和“不启用计时”。 3、怎么确定计时器执行没&#xff1f; 定一个数字全局变量&#xff0c;计时方法里面自增&#xff0c;然后输…

2024 CVPR AIGC集合

完全外行&#xff0c;不建议参考 一、3D重建 PointAvatar: Deformable Point-based Head Avatars from Videos 对原始颜色进行解纠缠&#xff0c;得到固有反射和相关阴影。 基于可变形点云对表情、颜色、位置等信息进行建模。 总结&#xff1a;可以看作是对局部像素的分解与扩…

gcc原理和使用

gcc gcc是什么 GCC&#xff0c;全称 GNU Compiler Collection&#xff08;GNU 编译器套件&#xff09;&#xff0c;是一套功能强大的编程语言编译器&#xff0c;由自由软件基金会&#xff08;Free Software Foundation, FSF&#xff09;作为GNU项目的一部分开发和维护。它最初…

【文献分享】机器学习 + 分子动力学 + 第一性原理 + 电导率 + 微观结构

​【文献分享】机器学习 分子动力学 第一性原理 电导率 微观结构 分享一篇关于机器学习 分子动力学 第一性原理 电导率 微观结构的文章。 感谢论文的原作者&#xff01; 关键词&#xff1a; 1. Machine learning force field 2. Molecular dynamics 3. Solid state …