Oracle中使用coe_load_sql_profile脚本固定执行计划

coe_load_sql_profile.sql 是Oracle数据库环境下用于迁移或固定SQL执行计划的一个脚本,它可以帮助DBA将特定SQL语句的高效执行计划转化为SQL Profile,并将其应用到目标数据库中。

SQL Profile是一种Oracle数据库中用来指导优化器选择特定执行计划的方法。

操作演示:使用 coe_load_sql_profile.sql 脚本来固定执行计划

1、准备演示环境

此操作需要以具有足够权限(如DBA权限)的非SYS用户,本操作中的scott用户已经具有了dba权限。

[oracle@db11g ~]$ sqlplus scott/scott
SQL*Plus: Release 11.2.0.4.0 Production on Tue Mar 19 16:56:53 2024Copyright (c) 1982, 2013, Oracle.  All rights reserved.Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsSCOTT@PROD11G> 
--查看一下emp表
SCOTT@PROD11G> select * from emp;EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------7369 SMITH      CLERK           7902 17-DEC-80        800                    207499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         307521 WARD       SALESMAN        7698 22-FEB-81       1250        500         307566 JONES      MANAGER         7839 02-APR-81       2975                    207654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         307698 BLAKE      MANAGER         7839 01-MAY-81       2850                    307782 CLARK      MANAGER         7839 09-JUN-81       2450                    107788 SCOTT      ANALYST         7566 19-APR-87       3000                    207839 KING       PRESIDENT            17-NOV-81       5000                    107844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         307876 ADAMS      CLERK           7788 23-MAY-87       1100                    207900 JAMES      CLERK           7698 03-DEC-81        950                    307902 FORD       ANALYST         7566 03-DEC-81       3000                    207934 MILLER     CLERK           7782 23-JAN-82       1300                    1014 rows selected.--给ename列创建一个索引emp_idx1
SCOTT@PROD11G> create index emp_idx1 on emp(ename);Index created.--运行SQL并查看执行计划
SCOTT@PROD11G> set autot traceSCOTT@PROD11G> select ename from emp where ename='name';no rows selectedExecution Plan
----------------------------------------------------------
Plan hash value: 654424206-----------------------------------------------------------------------------
| Id  | Operation        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT |          |     1 |     6 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| EMP_IDX1 |     1 |     6 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - access("ENAME"='name')Statistics
----------------------------------------------------------5  recursive calls0  db block gets2  consistent gets0  physical reads0  redo size333  bytes sent via SQL*Net to client513  bytes received via SQL*Net from client1  SQL*Net roundtrips to/from client0  sorts (memory)0  sorts (disk)0  rows processedSCOTT@PROD11G> -- 可以看到,执行计划走了索引扫描INDEX RANGE SCAN
-- 下面使用hint强制走全表扫描SCOTT@PROD11G> select /*+ FULL (EMP) */ ename from emp where ename='name';no rows selectedExecution Plan
----------------------------------------------------------
Plan hash value: 3956160932--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     6 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMP  |     1 |     6 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("ENAME"='name')Statistics
----------------------------------------------------------1  recursive calls0  db block gets6  consistent gets0  physical reads0  redo size333  bytes sent via SQL*Net to client513  bytes received via SQL*Net from client1  SQL*Net roundtrips to/from client0  sorts (memory)0  sorts (disk)0  rows processedSCOTT@PROD11G> -- 可以看到使用hint强制sql走了全表扫描
-- 下面查看sql的sql_id,plan_hash_value,sql_textselect sql_id ,plan_hash_value, sql_text from v$sql where sql_text like 'select%from emp%ename=%';
SQL_ID        PLAN_HASH_VALUE SQL_TEXT
------------- --------------- ------------------------------------------------------------------------------------
66q0r9w4df2f5       654424206 select ename from emp where ename='name'
3w056txhg3vdu      3956160932 select /*+ FULL (EMP) */ ename from emp where ename='name'

2、使用 coe_load_sql_profile脚本固定执行计划

下面执行 coe_load_sql_profile.sql 脚本来固定全表扫描的执行计划。

--执行coe_load_sql_profile.sql 脚本SCOTT@PROD11G> @coe_load_sql_profile.sqlParameter 1:
ORIGINAL_SQL_ID (required)Enter value for 1: 66q0r9w4df2f5    --输入源SQL的SQL_IDParameter 2:
MODIFIED_SQL_ID (required)Enter value for 2: 3w056txhg3vdu    --输入要固定执行计划的SQL的SQL_IDPLAN_HASH_VALUE          AVG_ET_SECS
-------------------- --------------------3956160932                 .002Parameter 3:
PLAN_HASH_VALUE (required)Enter value for 3: 3956160932     --输入要固定执行计划的SQL的PLAN_HASH_VALUEValues passed to coe_load_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ORIGINAL_SQL_ID: "66q0r9w4df2f5"
MODIFIED_SQL_ID: "3w056txhg3vdu"
PLAN_HASH_VALUE: "3956160932"SQL>BEGIN2    IF :sql_text IS NULL THEN3      RAISE_APPLICATION_ERROR(-20100, 'SQL_TEXT for original SQL_ID &&original_sql_id. was not found in memory (gv$sqltext_with_newlines) or AWR (dba_hist_sqltext).');4    END IF;5  END;6  /
SQL>SET TERM OFF;
SQL>BEGIN2    IF :other_xml IS NULL THEN3      RAISE_APPLICATION_ERROR(-20101, 'PLAN for modified SQL_ID &&modified_sql_id. and PHV &&plan_hash_value. was not found in memory (gv$sql_plan) or AWR (dba_hist_sql_plan).');4    END IF;5  END;6  /
SQL>
SQL>SET ECHO OFF;
0001 BEGIN_OUTLINE_DATA
0002 IGNORE_OPTIM_EMBEDDED_HINTS
0003 OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
0004 DB_VERSION('11.2.0.4')
0005 OPT_PARAM('_table_scan_cost_plus_one' 'false')
0006 ALL_ROWS
0007 OUTLINE_LEAF(@"SEL$1")
0008 FULL(@"SEL$1" "EMP"@"SEL$1")
0009 END_OUTLINE_DATA
dropping staging table "STGTAB_SQLPROF_66Q0R9W4DF2F5"
creating staging table "STGTAB_SQLPROF_66Q0R9W4DF2F5"
packaging new sql profile into staging table "STGTAB_SQLPROF_66Q0R9W4DF2F5"PROFILE_NAME
------------------------------
66Q0R9W4DF2F5_3956160932
SQL>REM
SQL>REM SQL Profile
SQL>REM ~~~~~~~~~~~
SQL>REM
SQL>SELECT signature, name, category, type, status2    FROM dba_sql_profiles WHERE name = :name;SIGNATURE NAME                           CATEGORY                       TYPE    STATUS
-------------------- ------------------------------ ------------------------------ ------- --------
10938475214343355302 66Q0R9W4DF2F5_3956160932       DEFAULT                        MANUAL  ENABLED
SQL>SELECT description2    FROM dba_sql_profiles WHERE name = :name;DESCRIPTION
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ORIGINAL:66Q0R9W4DF2F5 MODIFIED:3W056TXHG3VDU PHV:3956160932 SIGNATURE:10938475214343355302 CREATED BY COE_LOAD_SQL_PROFILE.SQL
SQL>SET ECHO OFF;****************************************************************************
* Enter SCOTT password to export staging table STGTAB_SQLPROF_66q0r9w4df2f5
****************************************************************************Export: Release 11.2.0.4.0 - Production on Tue Mar 19 17:32:01 2024Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.Password:  ---此处要输入操作用户scott的密码Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)
Note: grants on tables/views/sequences/roles will not be exported
Note: indexes on tables will not be exported
Note: constraints on tables will not be exportedAbout to export specified tables via Conventional Path ...
. . exporting table   STGTAB_SQLPROF_66Q0R9W4DF2F5          1 rows exported
Export terminated successfully without warnings.If you need to implement this Custom SQL Profile on a similar system,
import and unpack using these commands:imp SCOTT file=STGTAB_SQLPROF_66q0r9w4df2f5.dmp tables=STGTAB_SQLPROF_66q0r9w4df2f5 ignore=YBEGIN
DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF (
profile_name => '66Q0R9W4DF2F5_3956160932',
replace => TRUE,
staging_table_name => 'STGTAB_SQLPROF_66q0r9w4df2f5',
staging_schema_owner => 'SCOTT' );
END;
/updating: coe_load_sql_profile_66q0r9w4df2f5.log (deflated 76%)
updating: STGTAB_SQLPROF_66q0r9w4df2f5.dmp (deflated 89%)adding: coe_load_sql_profile.log (deflated 62%)deleting: coe_load_sql_profile.logcoe_load_sql_profile completed.
SQL>--当看到【coe_load_sql_profile completed.】时,表示执行计划固定完成。
--下面验证一下,直接执行sql然后查看执行计划SCOTT@PROD11G> select ename from emp where ename='name';no rows selectedExecution Plan
----------------------------------------------------------
Plan hash value: 3956160932--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     6 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMP  |     1 |     6 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("ENAME"='name')Note
------ SQL profile "66Q0R9W4DF2F5_3956160932" used for this statementStatistics
----------------------------------------------------------7  recursive calls0  db block gets11  consistent gets1  physical reads0  redo size333  bytes sent via SQL*Net to client513  bytes received via SQL*Net from client1  SQL*Net roundtrips to/from client0  sorts (memory)0  sorts (disk)0  rows processedSCOTT@PROD11G> --可以看到SQL已经走了全表扫描,并且可以看到使用了SQL profile【SQL profile "66Q0R9W4DF2F5_3956160932" used for this statement】固定了执行计划

3、查看SQL profile

创建完成后,可以查询USER_SQL_PROFILES或DBA_SQL_PROFILES视图来确认SQL Profile是否成功创建和应用到了相应的SQL语句上。

SCOTT@PROD11G> select * from dba_sql_profiles;NAME                           CATEGORY                        SIGNATURE
------------------------------ ------------------------------ ----------
SQL_TEXT
--------------------------------------------------------------------------------
CREATED
---------------------------------------------------------------------------
LAST_MODIFIED
---------------------------------------------------------------------------
DESCRIPTION
--------------------------------------------------------------------------------
TYPE    STATUS   FOR    TASK_ID TASK_EXEC_NAME                 TASK_OBJ_ID
------- -------- --- ---------- ------------------------------ -----------
TASK_FND_ID TASK_REC_ID
----------- -----------
66Q0R9W4DF2F5_3956160932       DEFAULT                        1.0938E+19
select ename from emp where ename='name'
19-MAR-24 05.32.00.000000 PM
19-MAR-24 05.32.00.000000 PM
ORIGINAL:66Q0R9W4DF2F5 MODIFIED:3W056TXHG3VDU PHV:3956160932 SIGNATURE:109384752
14343355302 CREATED BY COE_LOAD_SQL_PROFILE.SQL
MANUAL  ENABLED  NO-- 可以从dba_sql_profiles查询到sql profile :【66Q0R9W4DF2F5_3956160932】

4、总结

通过固定执行计划的方法,即使在Oracle优化器可能因为统计信息变化而选择不同执行计划的情况下,SQL Profile也能强制数据库按照已知高效的执行计划来执行SQL语句。这有助于保持应用程序的性能稳定性。

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

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

相关文章

【靶机测试--PHOTOGRAPHER: 1【php提权】】

前期准备 靶机下载地址: https://vulnhub.com/entry/photographer-1%2C519/ 信息收集 nmap 扫描同网段 ┌──(root㉿kali)-[/home/test/桌面] └─# nmap -sP 192.168.47.0/24 --min-rate 3333 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-19 07:37 …

SpringCloud Alibaba Nacos 服务注册和配置中心

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十二篇,即介绍 SpringCloud Alibaba Nacos 服务注册和配置中心。 二、Nacos 简介 2.1 为…

SpringBoot 监控 SQL 运行情况

Druid 数据库连接池相信很多小伙伴都用过,个人感觉 Druid 是阿里比较成功的开源项目了,不像 Fastjson 那么多槽点,Druid 各方面一直都比较出色,功能齐全,使用也方便,基本的用法就不说了,今天我们来看看 Druid 中的监控功能。 准备工作 首先我们来创建一个 Spring Boot…

Android API 30及更高版本网络权限设置

目录 一、网络权限设置二、配置步骤1、在 AndroidManifest.xml 文件中添加网络权限声明2、在 AndroidManifest.xml 文件中的 application 节点下配置网络安全策略 一、网络权限设置 在 Android API 30 及更高版本中,Google 引入了更严格的网络安全策略,…

wireshark数据捕获实验简述

Wireshark是一款开源的网络协议分析工具,它可以用于捕获和分析网络数据包。是一款很受欢迎的“网络显微镜”。 实验拓扑图: 实验基础配置: 服务器: ip:172.16.1.88 mask:255.255.255.0 r1: sys sysname r1 undo info enable in…

YOLOv5目标检测学习(6):源码解析之:训练部分train.py

文章目录 前言一、导入相关包与配置二、主函数main2.1 checks:检查rank值来判断是否打印参数、检查git仓库、检查包的安装2.2 判断是否恢复上一次模型训练提问:opt.data, opt.cfg, opt.hyp, opt.weights, opt.project各是什么? 2.3 DDP mode&…

【数据结构】哈希表与哈希桶

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.概念 2.哈希冲突…

mysql查询条件包含IS NULL、IS NOT NULL、!=、like %* 、like %*%,不能使用索引查询,只能使用全表扫描,是真的吗???

不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL、IS NOT NULL、!、like %* 、like %*%,不能使用索引查询,只能使用全表扫描。 刚入行时我也是这么认为的,还奉为真理! 但是时间工作中你会发现还是走索引…

Linux 常用运维使用指令

查询占用 CPU 最高的前 10 个进程 ps aux|grep -v PID|sort -rn -k 3|head 查询占用内存最大的前 10 个进程 ps aux|grep -v PID|sort -rn -k 4|head Linux du 获取文件比较大的前十 du -h / | sort -rh | head -n 10 解释: du: 磁盘使用情况命令。 -h: 参数…

C++基础入门(命名空间,函数,引用)

文章目录 前言1,命名空间2,函数函数重载缺省参数内联函数 3,引用尾声 前言 欢迎来到这篇关于C的入门博客!C是一门强大而又广泛应用的编程语言,作为一门面向对象的编程语言,C可以让你更好地组织和管理代码,提高代码的重用性和可维…

带你学会深度学习之卷积神经网络[CNN] - 3

前言 本文不讲述如泛化,前向后向传播,过拟合等基础概念。 本文图片来源于网络,图片所有者可以随时联系笔者删除。 CNN,常用于计算机视觉,是计算机视觉方面常见的基础模型,后面发展的有很多其他变种&…

实验7-3-6 字符串转换成十进制整数(PTA)

题目: 输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”&#…

图书推荐|图解算法:C语言实现+视频教学版

零负担理解数据结构及其算法的设计,零基础也能快速上手编程。 本书内容 《图解算法:C语言实现视频教学版》是一本综合讲述数据结构及其算法的入门书,力求简洁、清晰、严谨、且易于学习和掌握。 《图解算法:C语言实现视频教学版》…

Java基础学习: http请求中ContentType类型的取值

HTTP请求中的Content-Type头部用于指示发送到服务器的数据或从服务器发送到客户端的数据的媒体类型。以下是一些常见的Content-Type类型: application/json 用于发送或接收JSON格式的数据。JSON是一种轻量级的数据交换格式,易于人阅读和编写,…

经过拦截器cookie验证后用户信息放入哪里,以便后面接口使用

1.基于ThreadLocal实现,拦截器获取的用户信息在接口中使用_threadloacl获取账号数据_JAVADWangJing的博客-CSDN博客2基于ThreadLocal实现,拦截器获取的用户信息在接口中使用_threadloacl获取账号数据https://blog.csdn.net/wang_jing_jing/ar…

07 - Debian如何分区、格式化与挂载磁盘

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何分区、格式化与挂载磁盘 《傅老师Debian小知识库系列之07》——原创 前言 傅老师Debian小知识库特点: 1、最小化拆解Debian实用技能…

echarts多个折线图共用一个x轴和tooltip组件

实现效果 根据接口传来的数据&#xff0c;使用echarts绘制出&#xff0c;共用一个x轴的图表 功能&#xff1a;后端将所有数据传送过来&#xff0c;前端通过监听选中值来展示对应的图表数据 数据格式&#xff1a; 代码&#xff1a; <template><div><div clas…

Knife4j的相关知识点!!

一、基础概念 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! Knif4j&#xff08;原名为 Swagger-Bootstrap-UI&#xff09;是一款基于 Swagger 实现的文档管理工具&am…

3D模型网站怎么选择靠谱?

3D模型在各个领域的应用越来越广泛&#xff0c;如设计、建筑等。而在网上寻找高质量的3D模型成为了许多设计师和创作者的迫切需求。然而&#xff0c;面对众多的3D模型网站&#xff0c;如何选择一个靠谱的3D模型网站呢? 选择靠谱的3D模型网站是一个需要综合考虑多方面因素的过程…

MySQL 管理用户授权 DCL

管理用户 查询用户 use mysql select * from user;创建用户 //通配符: 主机名如果是 % 表示可以在任意主机登录 create user 用户名主机名 identified by 密码;修改用户 //方法1: update user set password password(新密码) where user 用户名; //方法2: set password f…