使用 sql_profile 固定SQL执行计划

1 扯蛋

近日 ,每天晚上固定时间,数据库会出现大量的latch:cache buffer chains 等待。经查 看发现原SQL语句走错执行计划,240G的表,进行全表扫描,引起热点块争用。通过固定 SQL语句的执行计划,使其可正常使用索引扫描,可以将该问题解决。下面为操作过程.

2 利用SQL PROFILE固定执行计划

 

2.1 查看原来语句的执行计划

  1. SQL> set autotrace traceonly
  2. SQL> SELECT NODEID
  3. 2 FROM ICDMIP.LHB_TEST T
  4. WHERE --T.INANITIONID is null AND
  5. 3 4 PARTID = SUBSTR(201302130046087636, 5, 4)
  6. 5 ;
  7. 596762 rows selected.
  8.  
  9. Execution Plan
  10. ----------------------------------------------------------
  11. Plan hash value: 514708567
  12. ----------------------------------------------------------------------------------------------------------------
  13. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
  14. ----------------------------------------------------------------------------------------------------------------
  15. | 0 | SELECT STATEMENT | | 412K| 10M| 3513 (1)| 00:00:43 | | |
  16. | 1 | PARTITION LIST SINGLE| | 412K| 10M| 3513 (1)| 00:00:43 | 44 | 44 |
  17. | 2 | TABLE ACCESS FULL | LHB_TEST | 412K| 10M| 3513 (1)| 00:00:43 | 44 | 44 | --这里发现走的全表扫描,全表有240G,引起性能问题
  18. ----------------------------------------------------------------------------------------------------------------
  19.  
  20. Statistics
  21. ----------------------------------------------------------
  22. 1 recursive calls
  23. 0 db block gets
  24. 54997 consistent gets --严重的逻辑读,SQL语句性能低下
  25. 580 physical reads
  26. 0 redo size
  27. 20489108 bytes sent via SQL*Net to client
  28. 438116 bytes received via SQL*Net from client
  29. 39786 SQL*Net roundtrips to/from client
  30. 0 sorts (memory)
  31. 0 sorts (disk)
  32. 596762 rows processed
  33. SQL> set autotrace off
  34. SQL> alter session set current_schema=ICDMIP;
  35.  
  36. Session altered.

2.2 指定SQL使用选择性比较好的索引

提前已查看,条件PARTID可以使用索引PK_MIP_OPERATIONPROCESS.来试试,使用这个索引后,执行计划怎么样。

  1. SQL> explain plan for SELECT/*+ INDEX(T PK_MIP_OPERATIONPROCESS)*/ NODEID
  2. 2 FROM ICDMIP.LHB_TEST T
  3. 3 WHERE T.INANITIONID = :B2
  4. 4 AND PARTID = SUBSTR(:B1, 5, 4);
  5. Explained.
  6. SQL> set linesize 500 pages 900
  7. SQL> select * from table(dbms_xplan.display(null,null,'outline');
  8. select * from table(dbms_xplan.display(null,null,'outline')
  9. *
  10. ERROR at line 1:
  11. ORA-00907: missing right parenthesis
  12.  
  13. SQL> a )
  14. 1* select * from table(dbms_xplan.display(null,null,'outline'))
  15. SQL> /
  16. PLAN_TABLE_OUTPUT
  17. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  18. Plan hash value: 1671553065
  19. ------------------------------------------------------------------------------------------------------------------------------
  20. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
  21. ------------------------------------------------------------------------------------------------------------------------------
  22. | 0 | SELECT STATEMENT | | 1 | 44 | 4 (0)| 00:00:01 | | |
  23. | 1 | PARTITION LIST SINGLE | | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
  24. | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| LHB_TEST | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
  25. |* 3 | INDEX UNIQUE SCAN | PK_MIP_OPERATIONPROCESS | 1 | | 3 (0)| 00:00:01 | KEY | KEY | --SQL已使用相关索引
  26. ------------------------------------------------------------------------------------------------------------------------------
  27. Outline Data
  28. -------------
  29. /*+
  30. BEGIN_OUTLINE_DATA
  31. INDEX_RS_ASC(@"SEL$1" "T"@"SEL$1" ("LHB_TEST"."INANITIONID" "LHB_TEST"."PARTID"))
  32. OUTLINE_LEAF(@"SEL$1")
  33. ALL_ROWS
  34. OPT_PARAM('optimizer_dynamic_sampling' 1)
  35. OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
  36. IGNORE_OPTIM_EMBEDDED_HINTS
  37. END_OUTLINE_DATA
  38. */
  39. Predicate Information (identified by operation id):
  40. ---------------------------------------------------
  41. 3 - access("T"."INANITIONID"=:B2 AND "PARTID"=SUBSTR(:B1,5,4))
  42. 29 rows selected.

2.3 生成sql profile

注意对比第二步中'Outline Data' 数据与本步骤中sys.sqlprof_attr内容的关系

  1. SQL> declare
  2. 2 v_hints sys.sqlprof_attr;
  3. 3 begin
  4. 4 v_hints := sys.sqlprof_attr(
  5. 5 'BEGIN_OUTLINE_DATA',
  6. 6 'IGNORE_OPTIM_EMBEDDED_HINTS',
  7. 7 'OPTIMIZER_FEATURES_ENABLE(''10.2.0.3'')',
  8. 8 'DB_VERSION(''10.2.0.3'')',
  9. 9 'ALL_ROWS',
  10. 10 'OUTLINE_LEAF(@"SEL$1")',
  11. 11 'INDEX_RS_ASC(@"SEL$1" "T"@"SEL$1" ("LHB_TEST"."INANITIONID" "LHB_TEST"."PARTID"))',
  12. 12 'END_OUTLINE_DATA');
  13. 13 dbms_sqltune.import_sql_profile(
  14. 14 'SELECT NODEID FROM ICDMIP.LHB_TEST T WHERE T.INANITIONID = :B2 AND PARTID = SUBSTR(:B1, 5, 4)',
  15. 15 v_hints,
  16. 16 'SQLPROFILE_T_M_O', --sql profile 名称
  17. 17 force_match=>true,
  18. 18 replace=>true);
  19. 19 end;
  20. 20 /
  21.  
  22. PL/SQL procedure successfully completed.

2.4 验证sql profile 是否生效

  1. SQL> explain plan for SELECT NODEID FROM ICDMIP.LHB_TEST T WHERE T.INANITIONID = :B2 AND PARTID = SUBSTR(:B1, 5, 4);
  2. Explained.
  3. SQL> select * from table(dbms_xplan.display);
  4. PLAN_TABLE_OUTPUT
  5. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  6. Plan hash value: 1671553065
  7. ------------------------------------------------------------------------------------------------------------------------------
  8. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
  9. ------------------------------------------------------------------------------------------------------------------------------
  10. | 0 | SELECT STATEMENT | | 1 | 44 | 4 (0)| 00:00:01 | | |
  11. | 1 | PARTITION LIST SINGLE | | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
  12. | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| LHB_TEST | 1 | 44 | 4 (0)| 00:00:01 | KEY | KEY |
  13. |* 3 | INDEX UNIQUE SCAN | PK_MIP_OPERATIONPROCESS | 1 | | 3 (0)| 00:00:01 | KEY | KEY |
  14. ------------------------------------------------------------------------------------------------------------------------------
  15. Predicate Information (identified by operation id):
  16. ---------------------------------------------------
  17. 3 - access("T"."INANITIONID"=:B2 AND "PARTID"=SUBSTR(:B1,5,4))
  18. Note
  19. -----
  20. - SQL profile "SQLPROFILE_T_M_O" used for this statement--注意,当生效后,这里会提示sql profile已使用
  21. 19 rows selected.
  22. SQL> exit
note
删除sql profile方法 exec dbms_sqltune.drop_sql_profile(name => '&sql_profile');

Author: halberd.lee

Created: 2019-06-22 Sat 18:35

Validate

sql_profile 固定SQL执行计划的更多相关文章

  1. sql执行计划解析案例(二)

    sql执行计划解析案例(二)   今天是2013-10-09,本来以前自己在专注oracle sga中buffer cache 以及shared pool知识点的研究.但是在研究cache buffe ...

  2. DB查询分析器7.01新增的周、月SQL执行计划功能

                DB查询分析器7.01新增的周.月SQL执行计划功能 马根峰              (广东联合电子服务股份有限公司, 广州 510300) 1      引言   中国本土 ...

  3. Oracle之SQL优化专题02-稳固SQL执行计划的方法

    首先构建一个简单的测试用例来实际演示: create table emp as select * from scott.emp; create table dept as select * from ...

  4. [转载]循规蹈矩:快速读懂SQL执行计划的套路与工具

    作者介绍 梁敬彬,福富研究院副理事长.公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验.多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的影响力.著有多本畅销书 ...

  5. Oracle sql执行计划解析

    Oracle sql执行计划解析 https://blog.csdn.net/xybelieve1990/article/details/50562963 Oracle优化器 Oracle的优化器共有 ...

  6. 来自灵魂的拷问——知道什么是SQL执行计划吗?

    面试官说:工作这么久了,应该知道sql执行计划吧,讲讲Sql的执行计划吧! 看了看面试官手臂上纹的大花臂和一串看不懂的韩文,吞了吞口水,暗示自己镇定点,整理了一下思绪缓缓的对面试官说:我不会 面试官: ...

  7. Atitit sql执行计划

    Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...

  8. 查看SQL执行计划

    一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call     count       cpu    elapsed       disk       ...

  9. 查看Oracle SQL执行计划的常用方式

    在查看SQL执行计划的时候有很多方式 我常用的方式有三种 SQL> explain plan for 2 select * from scott.emp where ename='KING'; ...

随机推荐

  1. JavaScript事件的基本学习

  2. Java_Eclipse_Android安装

    转自——链接:https://www.cnblogs.com/summary-2017/p/8073225.html

  3. 制作CentOS8安装U盘时遇到的“Minimal BASH-like...”问题

    ---恢复内容开始--- CentOS8已经推出了,正好最近新到了块服务器硬盘需要安装系统,就拿过来尝一下鲜. 下载好iso文件后,以制作CentOS7安装盘相同的步骤,用UltroISO(软碟通)往 ...

  4. memset初始化数组的坑

    memset函数常被我们用来初始化数组,然而有个坑可能会被我们踩到. 静态数组初始化 一般情形是这样的: #include <cstring> int main() { // 静态数组ar ...

  5. 第二章 Vue快速入门--7 讲解v-cloak、v-text、v-html的基本使用

    7 讲解v-cloak.v-text.v-html的基本使用 <!DOCTYPE html> <html lang="en"> <head> & ...

  6. .net core 读取appsettings 的配置

    { "Logging": { "IncludeScopes": false, "LogLevel": { "Default&quo ...

  7. java8新特性学习:函数式接口

    本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...

  8. 使用js拆分带参数的URL,将参数分离出来

    url中的内容www.XXXX.com?content=123; 一下为js内容,包装在一个init方法中. init(); function init(){ var theRequest = new ...

  9. uoj30【CF Round #278】Tourists(圆方树+树链剖分+可删除堆)

    - 学习了一波圆方树 学习了一波点分治 学习了一波可删除堆(巧用 ? STL) 传送门: Icefox_zhx 注意看代码看怎么构建圆方树的. tips:tips:tips:圆方树内存记得开两倍 CO ...

  10. 【51nod 1667】概率好题

    题目 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2平局 否则乙胜 分别 ...