sql_profile 固定SQL执行计划
使用 sql_profile 固定SQL执行计划
Table of Contents
1 扯蛋
近日 ,每天晚上固定时间,数据库会出现大量的latch:cache buffer chains 等待。经查 看发现原SQL语句走错执行计划,240G的表,进行全表扫描,引起热点块争用。通过固定 SQL语句的执行计划,使其可正常使用索引扫描,可以将该问题解决。下面为操作过程.
2 利用SQL PROFILE固定执行计划
2.1 查看原来语句的执行计划
- SQL> set autotrace traceonly
- SQL> SELECT NODEID
- 2 FROM ICDMIP.LHB_TEST T
- WHERE --T.INANITIONID is null AND
- 3 4 PARTID = SUBSTR(201302130046087636, 5, 4)
- 5 ;
- 596762 rows selected.
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 514708567
- ----------------------------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
- ----------------------------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 412K| 10M| 3513 (1)| 00:00:43 | | |
- | 1 | PARTITION LIST SINGLE| | 412K| 10M| 3513 (1)| 00:00:43 | 44 | 44 |
- | 2 | TABLE ACCESS FULL | LHB_TEST | 412K| 10M| 3513 (1)| 00:00:43 | 44 | 44 | --这里发现走的全表扫描,全表有240G,引起性能问题
- ----------------------------------------------------------------------------------------------------------------
- Statistics
- ----------------------------------------------------------
- 1 recursive calls
- 0 db block gets
- 54997 consistent gets --严重的逻辑读,SQL语句性能低下
- 580 physical reads
- 0 redo size
- 20489108 bytes sent via SQL*Net to client
- 438116 bytes received via SQL*Net from client
- 39786 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 596762 rows processed
- SQL> set autotrace off
- SQL> alter session set current_schema=ICDMIP;
- Session altered.
2.2 指定SQL使用选择性比较好的索引
提前已查看,条件PARTID可以使用索引PK_MIP_OPERATIONPROCESS.来试试,使用这个索引后,执行计划怎么样。
- SQL> explain plan for SELECT/*+ INDEX(T PK_MIP_OPERATIONPROCESS)*/ NODEID
- 2 FROM ICDMIP.LHB_TEST T
- 3 WHERE T.INANITIONID = :B2
- 4 AND PARTID = SUBSTR(:B1, 5, 4);
- Explained.
- SQL> set linesize 500 pages 900
- SQL> select * from table(dbms_xplan.display(null,null,'outline');
- select * from table(dbms_xplan.display(null,null,'outline')
- *
- ERROR at line 1:
- ORA-00907: missing right parenthesis
- SQL> a )
- 1* select * from table(dbms_xplan.display(null,null,'outline'))
- SQL> /
- PLAN_TABLE_OUTPUT
- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Plan hash value: 1671553065
- ------------------------------------------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
- ------------------------------------------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 44 | 4 (0)| 00:00:01 | | |
- | 1 | PARTITION LIST SINGLE | | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
- | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| LHB_TEST | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
- |* 3 | INDEX UNIQUE SCAN | PK_MIP_OPERATIONPROCESS | 1 | | 3 (0)| 00:00:01 | KEY | KEY | --SQL已使用相关索引
- ------------------------------------------------------------------------------------------------------------------------------
- Outline Data
- -------------
- /*+
- BEGIN_OUTLINE_DATA
- INDEX_RS_ASC(@"SEL$1" "T"@"SEL$1" ("LHB_TEST"."INANITIONID" "LHB_TEST"."PARTID"))
- OUTLINE_LEAF(@"SEL$1")
- ALL_ROWS
- OPT_PARAM('optimizer_dynamic_sampling' 1)
- OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
- IGNORE_OPTIM_EMBEDDED_HINTS
- END_OUTLINE_DATA
- */
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 3 - access("T"."INANITIONID"=:B2 AND "PARTID"=SUBSTR(:B1,5,4))
- 29 rows selected.
2.3 生成sql profile
注意对比第二步中'Outline Data' 数据与本步骤中sys.sqlprof_attr内容的关系
- SQL> declare
- 2 v_hints sys.sqlprof_attr;
- 3 begin
- 4 v_hints := sys.sqlprof_attr(
- 5 'BEGIN_OUTLINE_DATA',
- 6 'IGNORE_OPTIM_EMBEDDED_HINTS',
- 7 'OPTIMIZER_FEATURES_ENABLE(''10.2.0.3'')',
- 8 'DB_VERSION(''10.2.0.3'')',
- 9 'ALL_ROWS',
- 10 'OUTLINE_LEAF(@"SEL$1")',
- 11 'INDEX_RS_ASC(@"SEL$1" "T"@"SEL$1" ("LHB_TEST"."INANITIONID" "LHB_TEST"."PARTID"))',
- 12 'END_OUTLINE_DATA');
- 13 dbms_sqltune.import_sql_profile(
- 14 'SELECT NODEID FROM ICDMIP.LHB_TEST T WHERE T.INANITIONID = :B2 AND PARTID = SUBSTR(:B1, 5, 4)',
- 15 v_hints,
- 16 'SQLPROFILE_T_M_O', --sql profile 名称
- 17 force_match=>true,
- 18 replace=>true);
- 19 end;
- 20 /
- PL/SQL procedure successfully completed.
2.4 验证sql profile 是否生效
- SQL> explain plan for SELECT NODEID FROM ICDMIP.LHB_TEST T WHERE T.INANITIONID = :B2 AND PARTID = SUBSTR(:B1, 5, 4);
- Explained.
- SQL> select * from table(dbms_xplan.display);
- PLAN_TABLE_OUTPUT
- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Plan hash value: 1671553065
- ------------------------------------------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
- ------------------------------------------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 44 | 4 (0)| 00:00:01 | | |
- | 1 | PARTITION LIST SINGLE | | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
- | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| LHB_TEST | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
- |* 3 | INDEX UNIQUE SCAN | PK_MIP_OPERATIONPROCESS | 1 | | 3 (0)| 00:00:01 | KEY | KEY |
- ------------------------------------------------------------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 3 - access("T"."INANITIONID"=:B2 AND "PARTID"=SUBSTR(:B1,5,4))
- Note
- -----
- - SQL profile "SQLPROFILE_T_M_O" used for this statement--注意,当生效后,这里会提示sql profile已使用
- 19 rows selected.
- SQL> exit
- note
- 删除sql profile方法 exec dbms_sqltune.drop_sql_profile(name => '&sql_profile');
sql_profile 固定SQL执行计划的更多相关文章
- sql执行计划解析案例(二)
sql执行计划解析案例(二) 今天是2013-10-09,本来以前自己在专注oracle sga中buffer cache 以及shared pool知识点的研究.但是在研究cache buffe ...
- DB查询分析器7.01新增的周、月SQL执行计划功能
DB查询分析器7.01新增的周.月SQL执行计划功能 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 1 引言 中国本土 ...
- Oracle之SQL优化专题02-稳固SQL执行计划的方法
首先构建一个简单的测试用例来实际演示: create table emp as select * from scott.emp; create table dept as select * from ...
- [转载]循规蹈矩:快速读懂SQL执行计划的套路与工具
作者介绍 梁敬彬,福富研究院副理事长.公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验.多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的影响力.著有多本畅销书 ...
- Oracle sql执行计划解析
Oracle sql执行计划解析 https://blog.csdn.net/xybelieve1990/article/details/50562963 Oracle优化器 Oracle的优化器共有 ...
- 来自灵魂的拷问——知道什么是SQL执行计划吗?
面试官说:工作这么久了,应该知道sql执行计划吧,讲讲Sql的执行计划吧! 看了看面试官手臂上纹的大花臂和一串看不懂的韩文,吞了吞口水,暗示自己镇定点,整理了一下思绪缓缓的对面试官说:我不会 面试官: ...
- Atitit sql执行计划
Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...
- 查看SQL执行计划
一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call count cpu elapsed disk ...
- 查看Oracle SQL执行计划的常用方式
在查看SQL执行计划的时候有很多方式 我常用的方式有三种 SQL> explain plan for 2 select * from scott.emp where ename='KING'; ...
随机推荐
- JavaScript事件的基本学习
- Java_Eclipse_Android安装
转自——链接:https://www.cnblogs.com/summary-2017/p/8073225.html
- 制作CentOS8安装U盘时遇到的“Minimal BASH-like...”问题
---恢复内容开始--- CentOS8已经推出了,正好最近新到了块服务器硬盘需要安装系统,就拿过来尝一下鲜. 下载好iso文件后,以制作CentOS7安装盘相同的步骤,用UltroISO(软碟通)往 ...
- memset初始化数组的坑
memset函数常被我们用来初始化数组,然而有个坑可能会被我们踩到. 静态数组初始化 一般情形是这样的: #include <cstring> int main() { // 静态数组ar ...
- 第二章 Vue快速入门--7 讲解v-cloak、v-text、v-html的基本使用
7 讲解v-cloak.v-text.v-html的基本使用 <!DOCTYPE html> <html lang="en"> <head> & ...
- .net core 读取appsettings 的配置
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default&quo ...
- java8新特性学习:函数式接口
本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...
- 使用js拆分带参数的URL,将参数分离出来
url中的内容www.XXXX.com?content=123; 一下为js内容,包装在一个init方法中. init(); function init(){ var theRequest = new ...
- uoj30【CF Round #278】Tourists(圆方树+树链剖分+可删除堆)
- 学习了一波圆方树 学习了一波点分治 学习了一波可删除堆(巧用 ? STL) 传送门: Icefox_zhx 注意看代码看怎么构建圆方树的. tips:tips:tips:圆方树内存记得开两倍 CO ...
- 【51nod 1667】概率好题
题目 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2平局 否则乙胜 分别 ...