Oracle 19c OCM讲义课程:应用SQL执行计划基线的案例

news2024/11/15 17:46:36

使用SQL执行计划基线可以保证SQL的性能不下降,但实际生产中默认没有开启,这里是姚远老师在给OCM的学员授课中关于SQL执行计划基线的一个案例,大家可以借鉴一下。
在这里插入图片描述

关于号主,姚远:

  • Oracle ACE(Oracle和MySQL数据库方向)
  • 华为云最有价值专家
  • 《MySQL 8.0运维与优化》的作者
  • 拥有 Oracle 10g、12c和19c OCM等数十项数据库认证
  • 曾任IBM公司数据库部门经理
  • 20+年DBA经验,服务2万+客户
  • 精通C和Java,发明两项计算机专利

修改配置,采集SQL执行计划基线

Oracle 19c与SQL执行计划基线相关的默认参数值如下:

SQL> show parameter baseline
​
NAME             TYPE   VALUE
------------------------------------ ----------- ------------------------------
optimizer_capture_sql_plan_baselines boolean   FALSE
optimizer_use_sql_plan_baselines     boolean   TRUE
​

修改后的参数存放在视图DBA_SQL_MANAGEMENT_CONFIG中,检查一下:

COL PARAMETER_NAME FORMAT a32
COL PARAMETER_VALUE FORMAT a32
​
SELECT PARAMETER_NAME, PARAMETER_VALUE FROM   DBA_SQL_MANAGEMENT_CONFIG ;
​
PARAMETER_NAME       PARAMETER_VALUE
-------------------------------- --------------------------------
AUTO_CAPTURE_ACTION
AUTO_CAPTURE_MODULE
AUTO_CAPTURE_PARSING_SCHEMA_NAME parsing_schema IN (TPCC)
AUTO_CAPTURE_SQL_TEXT
AUTO_SPM_EVOLVE_TASK     OFF
AUTO_SPM_EVOLVE_TASK_INTERVAL   3600  -- 
AUTO_SPM_EVOLVE_TASK_MAX_RUNTIME 1800
PLAN_RETENTION_WEEKS     53  -- 53不用的计划会被清理
SPACE_BUDGET_PERCENT     10  -- 占用SYSAUX的空间不超过10%,超过在alert中报警
​
9 rows selected.
​

查看SQL执行计划基线的应用

先将一个索引改成不可见:

SQL> alter index tpcc.CUSTOMER_I1 invisible;
​
Index altered.

应用运行一段时间后,检查已经创建的SQL基线:

SQL> select count(distinct sql_handle),count(distinct plan_name),count(distinct SIGNATURE) from DBA_SQL_PLAN_BASELINES;
​
COUNT(DISTINCTSQL_HANDLE) COUNT(DISTINCTPLAN_NAME) COUNT(DISTINCTSIGNATURE)
------------------------- ------------------------ ------------------------
           30      30       30
​

可以看到为30个SQL建立了基线,都是ACCEPTED,因为每个SQL只有一个执行计划。

检查与这个索引相关的SQL的执行情况:

SQL> select SQL_ID,EXECUTIONS,OPTIMIZER_COST,SQL_PLAN_BASELINE from v$sql where sql_id='arykx3hpq9xsa';
​
​
SQL_ID        EXECUTIONS OPTIMIZER_COST SQL_PLAN_BASELINE
------------- ---------- -------------- ------------------------------
arykx3hpq9xsa      5102     1945 SQL_PLAN_2v1cfx8jds3vt3a6ea7ea
​

可以看到它用到了一个SQL基线的执行计划,成本是1945,查看这个SQL基线的执行计划:

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE('SQL_2d858eea22dc0f79','SQL_PLAN_2v1cfx8jds3vt3a6ea7ea','basic') );
​
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL handle: SQL_2d858eea22dc0f79
SQL text: UPDATE CUSTOMER SET C_BALANCE = C_BALANCE + :B1 WHERE C_W_ID = :B4
    AND C_D_ID = :B3 AND C_ID = :B2
--------------------------------------------------------------------------------
​
--------------------------------------------------------------------------------
Plan name: SQL_PLAN_2v1cfx8jds3vt3a6ea7ea    Plan id: 980330474
Enabled: YES   Fixed: NO  Accepted: YES    Origin: AUTO-CAPTURE
Plan rows: From dictionary
--------------------------------------------------------------------------------
​
Plan hash value: 3529770744
​
----------------------------------------
| Id  | Operation   | Name        |
----------------------------------------
|   0 | UPDATE STATEMENT |         |
|   1 |  UPDATE    | CUSTOMER    |
|   2 |   INDEX SKIP SCAN| CUSTOMER_I2 |
----------------------------------------
​
22 rows selected.
​

可以看到这个SQL执行中使用了CUSTOMER_I2 索引,没有使用CUSTOMER_I1索引,因为CUSTOMER_I1这个索引被修改成了不可见。这种检查SQL执行计划的方法和在游标中查询SQL执行计划的方法得到同样的结果:

set pagesize 200
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('arykx3hpq9xsa'));

将这个索引改成可见:

alter index tpcc.CUSTOMER_I1 visible;

第二次执行应用程序,然后再检查这个SQL的执行情况:

SQL>  select SQL_ID,EXECUTIONS,OPTIMIZER_COST,SQL_PLAN_BASELINE from v$sql where sql_id='arykx3hpq9xsa';
​
SQL_ID        EXECUTIONS OPTIMIZER_COST SQL_PLAN_BASELINE
------------- ---------- -------------- ------------------------------
arykx3hpq9xsa      2376     1945 SQL_PLAN_2v1cfx8jds3vt3a6ea7ea
​

发现这个SQL的执行成本和使用执行计划基线仍然没有发生变化,检查这个SQL对应的执行计划基线:

col plan_name form a30
col signature forma 99999999999999999999999
select sql_handle,plan_name,signature,accepted,optimizer_cost  from DBA_SQL_PLAN_BASELINES 
where SIGNATURE=(select EXACT_MATCHING_SIGNATURE from v$sql where sql_id='arykx3hpq9xsa');
​
SQL_HANDLE           PLAN_NAME             SIGNATURE ACC OPTIMIZER_COST
------------------------------ ------------------------------ ------------------------ --- --------------
SQL_2d858eea22dc0f79         SQL_PLAN_2v1cfx8jds3vt341d91fc     3280185039867613049 NO    3
SQL_2d858eea22dc0f79         SQL_PLAN_2v1cfx8jds3vt3a6ea7ea     3280185039867613049 YES       1945
​

发现这个SQL对应了两个基线,期中成本小到3的基线居然是没有被接受的!
在这里插入图片描述

手工进化基线

因为SQL基线的进化任务要到晚上维护窗口时才会执行,新的基线没有进化成可接受的,所以SQL执行时不会选择这个基线,我们可以手工对这个SQL基线进行进化:

VARIABLE cnt NUMBER
VARIABLE tk_name VARCHAR2(50)
VARIABLE exe_name VARCHAR2(50)
VARIABLE evol_out CLOB
​
begin
 :tk_name := DBMS_SPM.CREATE_EVOLVE_TASK(
  sql_handle => 'SQL_2d858eea22dc0f79',  
  plan_name  => 'SQL_PLAN_2v1cfx8jds3vt341d91fc');
end;
/
 
SELECT :tk_name FROM DUAL;
SQL> SELECT :tk_name FROM DUAL;
​
:TK_NAME
-----------------------
TASK_1551
​
EXECUTE :exe_name :=DBMS_SPM.EXECUTE_EVOLVE_TASK(task_name=>:tk_name); 
SELECT :exe_name FROM DUAL;
:EXE_NAME
--------------------------------
EXEC_3452
​

检查这个进化计划的执行报告:

EXECUTE :evol_out := DBMS_SPM.REPORT_EVOLVE_TASK( task_name=>:tk_name, execution_name=>:exe_name );
SELECT :evol_out FROM DUAL;
SQL> SELECT :evol_out FROM DUAL;
​
:EVOL_OUT
--------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
----------------------------------------------------
​
 Task Information:
 ---------------------------------------------
 Task Name        : TASK_1551
​
 Task Owner        : SYS
 Execution Name       : EXEC_3452
 Execution Type       : SPM EVOLVE
 Scope          : COMPREHENSIVE
​
 Status         : COMPLETED
 Started        : 09/08/2023 15:21:50
 Finished        : 09/08/2023 15:21:50
 Last Updated        : 09/08/2023 15:21:50
 Global Time Limit    : 2147483646
 Per-Plan Time Limit  : UNUSED
 Number of Errors     : 0
-----------------------------------------
SUMMARY SECTION
--------------------------------------------------
7  Number of plans processed  : 1
  Number of findings       : 1
  Number of recommendations  : 1
  Number of errors       : 0
--------------------------------------------------------
-------------------------------------
​
DETAILS SECTION
---------------------------------------------
----------------------------------------
--------
 Object ID      : 2
​
 Test Plan Name     : SQL_PLAN_2v1cfx8jds3vt341d91fc
 Base Plan Name     : SQL_PLAN_2v1cfx8jds3vt3a6ea7ea
 SQL Handle      : SQL_2d858eea22dc0f79
​
 Parsing Schema     : TPCC
​
 Test Plan Creator  : SYS
​
 SQL Text      : UPDATE CUSTOMER SET C_BALANCE = C_BALANCE + :B1 WHERE
        C_W_ID = :B4 AND C_D_ID= :B3 AND C_ID = :B2
​
Bind Variables:
-----------------------------
 2  -  (NUMBER):  3
​
 3  -  (NUMBER):  1
​
 4  -  (NUMBER):  2285
​
​
Execution Statistics:
-----------------------------
        Base Plan
    Test Plan
        --------------------
--------  ----------------------------
 Elapsed Time (s):  .00064    .000002
 CPU Time (s):      .000638    .000002
 Buffer Gets:      117    0
 Optimizer Cost:    1945    3
 Disk Reads:      0    0
 Direct Writes:     0    0
 Rows Processed:    0    0
 Executions:      10    10
​
​
FINDINGS SECTION
-----------------------------------------
Findings (1):
-----------------------------
 1. The plan was verified in 0.12000 seconds. It passed the benefit criterion
    because its verified performance was 390.90001 times better than that of
    the baseline plan.
​
Recommendation:
-----------------------------
 Consider accepting the plan. Execute
​
 dbms_spm.accept_sql_plan_baseline(task_name => 'TASK_1551', object_id => 2,
 task_owner => 'SYS');
​
EXPLAIN PLANS SECTION
---------------------------------------------
​
Baseline Plan
-----------------------------
 Plan Id    : 9217
 Plan Hash Value  : 980330474
​
-------------------------------------------
| Id  | Operation     | Name   | Rows | Bytes | Cost | Time     |
---------------------------------------------------
------------------------
|   0 | UPDATE STATEMENT   |     |    1 |    15 | 1945 | 00:00:01 |
|   1 |   UPDATE     | CUSTOMER   |  |  |    |         |
| * 2 |    INDEX SKIP SCAN | CUSTOMER_I2 |   1 |    15 | 1944 | 00:00:01 |
-----------------------------------------------
​
Predicate Information (identified by operation id)
:
------------------------------------------
* 2 - access("C_W_ID"=:B4 AND "C_D_ID"=:B3 AND "C_ID"=:B2)
* 2 - filter("C_ID"=:B2 AND "C_W_ID"=:B4 AND "C_D_ID"=:B3)
​
​
Test Plan
-----------------------------
 Plan Id    : 9218
 Plan Hash Value  : 874353148
​
----------------------------------------------------
| Id  | Operation       | Name     | Rows | Bytes | Cost | Time     |
--------------------------------------------------------
|   0 | UPDATE STATEMENT     |       |  1 |    15|    3 | 00:00:01 |
|   1 |   UPDATE       | CUSTOMER   |    |    |   |      |
| * 2 |    INDEX UNIQUE SCAN | CUSTOMER_I1 |    1 |    15 |    2 | 00:00:01 |
--------------------------------------------
​
Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("C_W_ID"=:B4 AND "C_D_ID"=:B3 AND "C_ID"=:B2)
​
--------------------------------------------------
​
​

根据报告中的建议,执行下面的SQL接受第二个基线:

SQL> exec dbms_spm.accept_sql_plan_baseline(task_name => 'TASK_1551', object_id => 2, task_owner => 'SYS');
​
PL/SQL procedure successfully completed.
​

再次检查这个SQL对应的执行计划基线:

col plan_name form a30
col signature forma 99999999999999999999999
select sql_handle,plan_name,signature,accepted,optimizer_cost  from DBA_SQL_PLAN_BASELINES
  2  where SIGNATURE=(select EXACT_MATCHING_SIGNATURE from v$sql where sql_id='arykx3hpq9xsa');
​
SQL_HANDLE           PLAN_NAME             SIGNATURE ACC OPTIMIZER_COST
------------------------------ ------------------------------ ------------------------ --- --------------
SQL_2d858eea22dc0f79         SQL_PLAN_2v1cfx8jds3vt341d91fc     3280185039867613049 YES    3
SQL_2d858eea22dc0f79         SQL_PLAN_2v1cfx8jds3vt3a6ea7ea     3280185039867613049 YES       1945
​

发现两个基线都是接受的。

第三次执行应用后,然后检查SQL的执行情况:

SQL> select SQL_ID,EXECUTIONS,OPTIMIZER_COST,SQL_PLAN_BASELINE from v$sql where sql_id='arykx3hpq9xsa';
​
SQL_ID        EXECUTIONS OPTIMIZER_COST SQL_PLAN_BASELINE
------------- ---------- -------------- ------------------------------
arykx3hpq9xsa      6849        3 SQL_PLAN_2v1cfx8jds3vt341d91fc
​

发现应用的SQL采用了第二个基线,执行成本从1945降低到3。

删除SQL基线

使用dbms_spm.drop_sql_plan_baseline可以删除SQL基线,但不能一次删除所有的SQL基线,如果要删除所有的SQL基线,需要用游标进行循环删除 ,相关程序如下(参见Doc ID 790039.1)

declare
pgn number;
sqlhdl varchar2(30);
cursor hdl_cur is
select distinct sql_handle from dba_sql_plan_baselines;
begin
open hdl_cur;
loop
fetch hdl_cur into sqlhdl;
exit when hdl_cur%NOTFOUND;
pgn := dbms_spm.drop_sql_plan_baseline(sql_handle=>sqlhdl);
end loop;
close hdl_cur;
commit;
end;
 /
​
PL/SQL procedure successfully completed.
​
SQL> select count(*) from dba_sql_plan_baselines;
​
  COUNT(*)
----------
   0
​

​# 欢迎加我的微信,拉你进数据库微信群👇

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

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

相关文章

eNSP-OSPF协议其他区域不与骨干区域相连解决方法1

OSPF多进程路由重分布 AR1 [ar1]int g0/0/0 [ar1-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [ar1-GigabitEthernet0/0/0]quit [ar1]ospf [ar1-ospf-1]area 0 [ar1-ospf-1-area-0.0.0.0]net 192.168.1.0 0.0.0.255 [ar1-ospf-1-area-0.0.0.0]quitAR2 [ar2]int g0/0/0 [ar2…

C++ 类和对象(1)

大纲 初步认识类和对象 c语言是面向过程的 关注的是过程 分析出求问题的步骤 通过调用函数逐步解决 c是基于面向对象的 关注的是对象 将一件事情拆分成不同的对象 靠对象之间的交互完成 举个栗子 把大象关进冰箱。 面向过程的分析过程: 第一步:把冰…

优思学院|六西格玛的发展历程是怎样的?

在商业世界的星空中,有一颗璀璨的星星,它的名字叫做六西格玛。这颗星星不是一夜之间闪耀登场的,而是在商界的无尽深夜中,逐渐积累了耀眼的光芒。今天,我就来为大家介绍一下六西格玛的发展历程吧。 西格玛是啥&#xff…

nginx+apach+数据恢复+apk小练习hunan

这份练习来自项师兄,我们湖南警官的新一代大佬向专家,我就向师兄讨要了检材一份,然后自己练习一下在csdn写一下我的刷题经历,如有错误,还请指正,另外可以看向师兄的微信公众号 2023某省电子取证比武wp“ 参加比赛侥幸拿下第一,发一发复盘wp,大佬勿喷,如有错误请指出,…

R语言:因子分析 factor analysis

文章目录 因子分析数据集处理步骤主成分法做因子分析最大似然法做因子分析 因子分析 因子分析的用途与主成分分析类似,它也是一种降维方法。由于因子往往比主成分更易得到解释,故因子分析比主成分分析更容易成功,从而有更广泛的应用。 从方法…

Mac文件对比同步工具 Beyond Compare 4.4.7

Beyond Compare 4 是一款强大的文件和文件夹比较工具。它提供了一个直观的界面,使您可以快速比较和同步文件和文件夹。 Beyond Compare 4 具有许多有用的功能,包括比较和合并文件、文件夹和压缩文件,以及同步文件和文件夹。它支持各种类型的文…

万圣节海外网红营销:助力品牌赢得消费者的心

万圣节,源自古代凯尔特文化,如今已成为一个全球性的节庆。它不仅是一个传统的庆祝活动,还是商业和品牌推广的黄金机会。在当今数字时代,社交媒体和网红文化已经成为品牌推广的重要渠道。万圣节为品牌提供了一个独特的机会&#xf…

点进来看看要如何在Telegram上找到目标群组

Telegram作为目前除了WhatsApp之外,在苹果应用商店市场第二高下载量的社交媒体平台是我们出海企业不可以错过的资源。而且就在日前海外科技媒体TechCrunch爆料称,Telegram正与腾讯展开合作,有望将Telegram打造为一个类似微信的“超级应用生态…

java 使用poi读取excel内浮动图片

注意&#xff1a;仅读取到xls中的浮动图片&#xff0c;嵌入图片此方法读取不到 1、引入poi依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><depen…

C++11包装器

文章目录 1.当前程序的问题2.包装器的引入2.1包装器的定义2.2包装器的使用2.3包装器的出现对于2.1问题的解决 3.包装器的应用3.1C98写法3.2C11写法count()的用法下标运算符operator[ ]lambda表达式的另一种用法C11写法 1.当前程序的问题 template<class T, class K> K u…

MSC应用新进展

2023年9月23日&#xff0c;第四届中国干细胞与再生医学协同创新平台大会正式发布了我国首个人源干细胞国家标准《生物样本库多能干细胞管理技术规范》(GB/T42466-2023)&#xff0c;标志着我国在干细胞样本库管理上有了标准技术支撑&#xff0c;对于推动我国干细胞研究和应用的规…

React之Redux详解

一、Redux 1、是什么 React是用于构建用户界面的&#xff0c;帮助我们解决渲染DOM的过程 而在整个应用中会存在很多个组件&#xff0c;每个组件的state是由自身进行管理&#xff0c;包括组件定义自身的state、组件之间的通信通过props传递、使用Context实现数据共享 如果让…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.8 绘图事件

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.8 绘图事件(1) 本章要实现的整体效果如下&#xff1a; QEvent::Paint ​ 当窗口/控件需要重绘时&#xff0c;触发该事件&#xff0c;它对应的子类是 QPaintEvent 本节通过一个向 QLabel 上绘制…

“揭秘!如何通过京东商品详情接口轻松获取海量精准商品信息!“

京东商品详情接口可以通过HTTP GET请求获取商品详情信息。 请求参数包括num_iid&#xff0c;表示JD商品ID。 请求示例&#xff1a; GET /jd/item_get/?num_iid10335871600 HTTP/1.1 Host: api-vx.Taobaoapi2014.cn Connection: close Accept-Encoding: gzip 点击获取…

决策树深度探索: 从基础构建到机器学习应用

机器学习 第六课 决策树 概述决策树的基本概念决策树的应用决策树的基本构建节点 (Node)分支 (Branch)决策树的构造过程 信息增益熵 (Entropy)条件熵 (Conditional Entropy)信息增益 (Information Gain) 信息熵计算计算数据集的熵计算在给定属性条件下的熵计算信增益 (Informat…

深入剖析Java类加载过程:探寻类加载器的奥秘

摘要: 一个java文件从被加载到被卸载这个生命过程&#xff0c;总共要经历4个阶段&#xff1a; 加载->链接&#xff08;验证准备解析&#xff09;->初始化&#xff08;使用前的准备&#xff09;->使用->卸载 其中类加载过程包括加载、验证、准备、解析和初始化五个阶…

如何使用Abaqus import进行预应力跌落仿真

跌落测试除了单次跌落外&#xff0c;根据不同的标准需求&#xff0c;还有多次跌落或者预应力跌落&#xff0c;上次我们进行了单次跌落在Abaqus中的实现过程&#xff0c;今天我们使用Abaqus Import功能&#xff0c;进行卡扣的预应力跌落。 首先进行卡扣的装配仿真&#xff0c;在…

Note——time

time import import datetime import timeDefinition of time from 1970-01-01 00:00:00 UTC Coordinated Universal Time as the float format of ‘seconds’ For example use structured time lists [ year,month,day,hours,minutes,seconds…] 表示从1970-01-01 00:00:…

当苹果铅笔不能工作时,不一定都是苹果铅笔的问题!苹果铅笔不工作时如何修复

你的苹果铅笔没有按预期工作,可能有几个原因;大多数都有相当简单的修复方法。苹果铅笔的故障排除技巧在两代配件中基本相同。 本文中的信息适用于兼容iPad上的苹果铅笔(第二代)和苹果铅笔(第一代)。 检查蓄电池 苹果铅笔的电池必须充电才能工作。要检查iPad上的电池状…