coe_xfr_sql_profile.sql 使用案例

news/2024/10/23 5:30:45/

假设生产库有一个sql (select * from test where id=:1;),执行计划如下,我认为它走索引比较合适,但是无论如何加 hint ,它始终还是走全表扫。

SQL>  select * from table(dbms_xplan.display_cursor);  PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  f5ug8jqf4msr1, child number 0
-------------------------------------
select * from test where id=1Plan hash value: 1357081020--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     3 (100)|          |
|*  1 |  TABLE ACCESS FULL| TEST |  1024 | 20480 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("ID"=1)

但是在测试环境 使用 explain plan for select * from test where id=:1; 发现该sql 走索引 ,但是测试环境的v$sql 里面却没有sql_id (f5ug8jqf4msr1) 信息 。

----------------------------------------------------------------------------------------------
| Id  | Operation                           | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |        |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TEST   |     1 |    20 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IDX_ID |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

这时候我用常量替换sql中的变量,在测试库执行,得到的sql_id 及执行计划如下,该执行计划是我想要的。

SQL>  select * from table(dbms_xplan.display_cursor);  PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  41zg1jt50tv8m, child number 0
-------------------------------------
select * from test where id=2Plan hash value: 3297604684----------------------------------------------------------------------------------------------
| Id  | Operation                           | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |        |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TEST   |     1 |    20 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IDX_ID |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

在测试环境使用脚本 coe_xfr_sql_profile.sql,生成文件coe_xfr_sql_profile_41zg1jt50tv8m_3297604684.sql

SQL> @coe_xfr_sql_profile.sqlParameter 1:
SQL_ID (required)Enter value for 1: 41zg1jt50tv8mPLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------3297604684        .005Parameter 2:
PLAN_HASH_VALUE (required)Enter value for 2: 3297604684Values passed to coe_xfr_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL_ID         : "41zg1jt50tv8m"
PLAN_HASH_VALUE: "3297604684"
…………
…………
…………

在生产环境使用脚本 coe_xfr_sql_profile.sql,生成文件coe_xfr_sql_profile_f5ug8jqf4msr1_1357081020.sql

SQL> @coe_xfr_sql_profile.sql;Parameter 1:
SQL_ID (required)Enter value for 1: f5ug8jqf4msr1PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------1357081020        .039Parameter 2:
PLAN_HASH_VALUE (required)Enter value for 2: 1357081020Values passed to coe_xfr_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL_ID         : "f5ug8jqf4msr1"
PLAN_HASH_VALUE: "1357081020"…………
…………

我们发现生成的文件都有类似下面的一段代码

h := SYS.SQLPROF_ATTR(
q'[BEGIN_OUTLINE_DATA]',
q'[IGNORE_OPTIM_EMBEDDED_HINTS]',
q'[OPTIMIZER_FEATURES_ENABLE('19.1.0')]',
q'[DB_VERSION('19.1.0')]',
q'[ALL_ROWS]',
q'[OUTLINE_LEAF(@"SEL$1")]',
q'[INDEX_RS_ASC(@"SEL$1" "TEST"@"SEL$1" ("TEST"."ID"))]',
q'[BATCH_TABLE_ACCESS_BY_ROWID(@"SEL$1" "TEST"@"SEL$1")]',
q'[END_OUTLINE_DATA]');

将 coe_xfr_sql_profile_f5ug8jqf4msr1_1357081020.sql (生产环境)中的该段代码用 coe_xfr_sql_profile_41zg1jt50tv8m_3297604684.sql(测试环境)中的替换,最后在生产环境执行coe_xfr_sql_profile_f5ug8jqf4msr1_1357081020.sql,保证运行成功。

查看v$sql 视图,我们发现sql 使用 profile( coe_f5ug8jqf4msr1_1357081020 ),并且PLAN_HASH_VALUE 变成了测试环境sql 的PLAN_HASH_VALUE 了。

SQL>  select EXECUTIONS,plan_hash_value,sql_profile  from v$sql where sql_id='f5ug8jqf4msr1';EXECUTIONS PLAN_HASH_VALUE
---------- ---------------
SQL_PROFILE
----------------------------------------------------------------1      3297604684
coe_f5ug8jqf4msr1_1357081020

执行计划确实走索引了 

Plan hash value: 3297604684----------------------------------------------------------------------------------------------
| Id  | Operation                           | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |        |       |       |     6 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TEST   |  1024 | 20480 |     6   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IDX_ID |  1024 |       |     5   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access("ID"=1)Note
------ dynamic statistics used: dynamic sampling (level=2)- SQL profile coe_f5ug8jqf4msr1_1357081020 used for this statement


http://www.ppmy.cn/news/308705.html

相关文章

用Python turtle库 绘制皮卡丘

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图…

营救皮卡丘

营救皮卡丘 【问题描述】 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也 为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路。 火箭队一共有N 个据点,据点之间存…

在竞赛中不断成长--(广油最帅的崽)行走的皮卡丘

“等我苦尽甘来,我给你讲讲我来时走的路” 在竞赛中不断成长--(广油最帅的崽)行走的皮卡丘 个人简介--行走的皮卡丘(广油最帅的崽)一、参加2019年全国大学生电子设计竞赛1.1、做了什么工作?1.1.1.具备良好的…

用Python绘制皮卡丘

来源:动态图片基地 科普:皮卡丘是日本任天堂公司开发的掌机游戏系列《口袋妖怪》中登场精灵中的一种,为口袋妖怪里代表性的角色。 随着其周边动画宠物小精灵(即神奇宝贝)动画的热播,这只神奇宝贝的魅力逐…

好看的emoji表情

🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀 插入CSDN或者MarkDown都OK 例如Typroa就可以使用 Expression 😀 😃 😄…

vue生成二维码和二维码中带图片

一、生成简单的二维码&#xff08;不带图片&#xff09; 1.引入插件 npm install qrcode --save2.页面中使用 <div id"qrcode" class"erweima"></div>页面中引入 import QRCode from "qrcodejs2";methods: {qrcode() {this.$nex…

大侦探皮卡丘

大侦探皮卡丘 概述 观影时间&#xff1a;2019-05-25 08:35:00观影地点&#xff1a;华夏天合电影效果&#xff1a;国语3D 情节 科幻世界&#xff1a;人类与精灵宝贝和谐共存主要人物 男主父亲&#xff1a;侦探&#xff0c;搭档是一个皮卡丘男主&#xff1a;卖保险的&#xff0…

画一只会动的皮卡丘(下)

&#xff01;精品网站推荐&#xff1a; 一个喜欢开发的小玩意的网站&#xff1a; https://codepen.io/ 本篇清单List 1. 页面布局 2. 动态生成代码与皮卡丘style 3. 3.实现速度的控制上篇中我们已经实现了静态的皮卡丘&#xff0c;我们需要让他动起来。 1.页面的布局 这里我…