Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划
固定执行计划-使用SPM(Sql Plan Management)固定执行计划
转载自:http://www.lunar2013.com/2016/01/固定执行计划-使用spm%EF%BC%88sql-plan-management%EF%BC%89固定执行计划.html
.
固定执行计划-使用SQL Tuning Advisor
固定执行计划-手工指定PLAN OUTLINE
固定执行计划-手工指定索引名称的方式
固定执行计划-使用coe_xfr_sql_profile固定执行计划
固定执行计划-使用SPM(Sql Plan Management)固定执行计划
.
在Oracle 11g前,我们可以借助存储大纲(Stored Outline)和SQL Profile来帮助我们固定某个SQL语句的执行计划。
11g中,Oracle 提供了SPM(Sql Plan Management)。
通过这个特性,可以考虑让Oracle自动去判断某个SQL的新的执行计划是否更加合理(成本更低),只有在新的执行计划比原来的执行计划更好才会被使用,从而保护了执行计划的稳定性和SQL语句的执行效率。
可以考虑手工捕获和自动捕获两种方式,这里我们采用手工捕获(11.2的缺省设置是非自动捕获)。
首先查看当前为禁止自动捕获的状态:
SYS@lunardb>show parameter optimizer_capture_sql_plan_baselinesNAME TYPE VALUE------------------------------------ ----------- ------------------------------optimizer_capture_sql_plan_baselines boolean FALSESYS@lunardb> |
当前SPM中没有内容:
LUNAR@lunardb>select signature,sql_handle,plan_name,origin,enabled,accepted,autopurge from dba_sql_plan_baselines;no rows selectedElapsed: 00:00:00.00LUNAR@lunardb> |
手工加载一个SQL到SPM中:
LUNAR@lunardb>declare 2 l_plans_loaded PLS_INTEGER; 3 begin 4 l_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => '&sql_id'); 5 DBMS_OUTPUT.put_line('Plans Loaded: ' || l_plans_loaded); 6 END; 7 /Enter value for sql_id: bjgduva68mbqmold 4: l_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => '&sql_id');new 4: l_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => 'bjgduva68mbqm');Plans Loaded: 1PL/SQL procedure successfully completed.Elapsed: 00:00:00.21LUNAR@lunardb>LUNAR@lunardb>select signature,sql_handle,plan_name,origin,enabled,accepted,autopurge from dba_sql_plan_baselines; SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC AUT---------------- ------------------------------ ------------------------------ -------------- --- --- ---6.5941520220E+17 SQL_0926b6a1f69f6f5c SQL_PLAN_0k9pqn7v9yvuw02b73393 MANUAL-LOAD YES YES YESElapsed: 00:00:00.01LUNAR@lunardb> |
由于上一个测试,我们已经有了正确的执行计划,即:
LUNAR@lunardb>select * from table(dbms_xplan.display_cursor(sql_id=>'bjgduva68mbqm')) where plan_table_output like ('Plan hash value%');PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 3241900148Elapsed: 00:00:00.02LUNAR@lunardb>LUNAR@lunardb>select SQL_HANDLE, PLAN_NAME, ENABLED, ACCEPTED, SQL_TEXT 2 from DBA_SQL_PLAN_BASELINES 3 where ACCEPTED = 'YES' 4 order by LAST_MODIFIED;SQL_HANDLE PLAN_NAME ENA ACC SQL_TEXT------------------------------ ------------------------------ --- --- --------------------------------------------------------------------------------SQL_0926b6a1f69f6f5c SQL_PLAN_0k9pqn7v9yvuw02b73393 YES YES select /*+ no_index(lunartest1 idx_lunartest1_n) */ * from lunartest1 where n=1Elapsed: 00:00:00.01LUNAR@lunardb> |
下面,我们装载指定的执行计划:
LUNAR@lunardb>variable cnt number ;LUNAR@lunardb>exec :cnt :=dbms_spm.LOAD_PLANS_FROM_CURSOR_CACHE (SQL_ID => '&SQL_ID',PLAN_HASH_VALUE => &plan_hash_value, SQL_HANDLE => '&SQL_HANDLE' ) ; Enter value for sql_id: bjgduva68mbqmEnter value for plan_hash_value: 1172089107Enter value for sql_handle: SQL_0926b6a1f69f6f5cPL/SQL procedure successfully completed.Elapsed: 00:00:00.02LUNAR@lunardb>select signature,sql_handle,plan_name,origin,enabled,accepted,autopurge 2 from dba_sql_plan_baselines where CREATED>sysdate-1/48 order by created; SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC AUT---------------------- ------------------------------ ------------------------------ -------------- --- --- --- 659415202199990108 SQL_0926b6a1f69f6f5c SQL_PLAN_0k9pqn7v9yvuw02b73393 MANUAL-LOAD YES YES YESElapsed: 00:00:00.00LUNAR@lunardb> |
确认该执行计划的OUTLINE:
LUNAR@lunardb>SELECT extractValue(value(h),'.') AS hint 2 FROM sys.sqlobj$data od, sys.sqlobj$ so, 3 table(xmlsequence(extract(xmltype(od.comp_data),'/outline_data/hint'))) h 4 WHERE so.name = 'SQL_PLAN_0k9pqn7v9yvuw02b73393' 5 AND so.signature = od.signature 6 AND so.category = od.category 7 AND so.obj_type = od.obj_type 8 AND so.plan_id = od.plan_id;HINT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------IGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('11.2.0.4')DB_VERSION('11.2.0.4')ALL_ROWSOUTLINE_LEAF(@"SEL$1")INDEX(@"SEL$1" "LUNARTEST1"@"SEL$1" ("LUNARTEST1"."N"))6 rows selected.Elapsed: 00:00:00.08LUNAR@lunardb> |
这里看到是我们需要的走索引的outline,详细的OUTLINE信息如下:
LUNAR@lunardb>SELECT extractValue(value(h),'.') AS hint 2 FROM sys.sqlobj$data od, sys.sqlobj$ so, 3 table(xmlsequence(extract(xmltype(od.comp_data),'/outline_data/hint'))) h 4 WHERE so.signature = '659415202199990108' 5 AND so.signature = od.signature 6 AND so.category = od.category 7 AND so.obj_type = od.obj_type 8 AND so.plan_id = od.plan_id;HINT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------BEGIN_OUTLINE_DATAIGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('11.2.0.4')DB_VERSION('11.2.0.4')ALL_ROWSOUTLINE_LEAF(@"SEL$1")INDEX(@"SEL$1" "LUNARTEST1"@"SEL$1" ("LUNARTEST1"."N"))END_OUTLINE_DATAIGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('11.2.0.4')DB_VERSION('11.2.0.4')ALL_ROWSOUTLINE_LEAF(@"SEL$1")INDEX(@"SEL$1" "LUNARTEST1"@"SEL$1" ("LUNARTEST1"."N"))14 rows selected.Elapsed: 00:00:00.10LUNAR@lunardb> |
现在我们删除profile以前用coe绑定的sql profile:
LUNAR@lunardb>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------- -------- --- ---------------- ------------------------------ ---------------- ---------------- ----------------coe_bjgduva68mbqm_3241900148 DEFAULT 659415202199990108 select /*+ no_index(lunartest1 idx_lunartest1_n) */ * from lunartest1 where n=112-JAN-16 11.24.18.000000 AM 12-JAN-16 11.40.52.000000 AMcoe bjgduva68mbqm 3241900148 659415202199990108 9900816299026594015MANUAL ENABLED NOElapsed: 00:00:00.01LUNAR@lunardb>LUNAR@lunardb>exec dbms_sqltune.drop_sql_profile('coe_bjgduva68mbqm_3241900148'); PL/SQL procedure successfully completed.Elapsed: 00:00:00.01LUNAR@lunardb>SELECT * FROM DBA_SQL_PROFILES;no rows selectedElapsed: 00:00:00.00LUNAR@lunardb> |
再次验证SPM的执行计划:
LUNAR@lunardb>select * from table(dbms_xplan.DISPLAY_SQL_PLAN_BASELINE('&sql_handle','&PLAN_NAME'));Enter value for sql_handle: SQL_0926b6a1f69f6f5cEnter value for plan_name: SQL_PLAN_0k9pqn7v9yvuw02b73393old 1: select * from table(dbms_xplan.DISPLAY_SQL_PLAN_BASELINE('&sql_handle','&PLAN_NAME'))new 1: select * from table(dbms_xplan.DISPLAY_SQL_PLAN_BASELINE('SQL_0926b6a1f69f6f5c','SQL_PLAN_0k9pqn7v9yvuw02b73393'))PLAN_TABLE_OUTPUT----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL handle: SQL_0926b6a1f69f6f5cSQL text: select /*+ no_index(lunartest1 idx_lunartest1_n) */ * from lunartest1 where n=1----------------------------------------------------------------------------------------------------------------------------------------------------------------Plan name: SQL_PLAN_0k9pqn7v9yvuw02b73393 Plan id: 45560723Enabled: YES Fixed: NO Accepted: YES Origin: MANUAL-LOAD--------------------------------------------------------------------------------Plan hash value: 3241900148-------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 4 | 1 (0)| 00:00:01 ||* 1 | INDEX RANGE SCAN| IDX_LUNARTEST1_N | 1 | 4 | 1 (0)| 00:00:01 |-------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 1 - access("N"=1)25 rows selected.Elapsed: 00:00:00.16LUNAR@lunardb> |
执行SQL,发现SPM可以固定执行计划,使用了我们期待的:
LUNAR@lunardb>set autotrace traceo exp statLUNAR@lunardb>select /*+ no_index(lunartest1 idx_lunartest1_n) */ * from lunartest1 where n=1;Elapsed: 00:00:00.13Execution Plan----------------------------------------------------------Plan hash value: 3241900148-------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 4 | 1 (0)| 00:00:01 ||* 1 | INDEX RANGE SCAN| IDX_LUNARTEST1_N | 1 | 4 | 1 (0)| 00:00:01 |-------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 1 - access("N"=1)Note----- - SQL plan baseline "SQL_PLAN_0k9pqn7v9yvuw02b73393" used for this statementStatistics---------------------------------------------------------- 59 recursive calls 52 db block gets 36 consistent gets 1 physical reads 15312 redo size 519 bytes sent via SQL*Net to client 523 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processedLUNAR@lunardb> |
这里看到已经使用了SPM中的SQL Profile:SQL_PLAN_0k9pqn7v9yvuw02b73393
总结:
这里已经使用了我们的SPM(SQL_PLAN_0k9pqn7v9yvuw02b73393)固定了执行计划,sql使用了索引
说明SPM绑定执行计划的方式比hint的优先级高
Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划的更多相关文章
- 11g新特性-SQL Plan Management
在11g之前版本,提供了stored outlines(sql概要)特性来保存sql的执行计划. 在11g中,引入了一个新的特性sql计划管理(sql plan management)特性来保存sql ...
- oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)
1. 简介 Oracle Database11gR1引进了SQL PlanManagement(简称SPM),一套允许DBA捕获和保持任意SQL语句执行计划最优的新工具,这样,限制了刷新优化器统计 ...
- 11g的新特性:SQL Plan Management(SPM)
Oracle11g中,Oracle提供dbms_spm包来管理SQL Plan,SPM是一个预防机制,它记录并评估sql的执行计划,将已知的高效的sql执行计划建立为SQL Plan Baseline ...
- Bullet:ORACLE Using SQL Plan Management(一)
SQL Plan Management如何工作? 当一个SQL硬解析时,基于成本的优化器CBO会生成多个执行计划,并从这些执行计划中选择一个优化器认为最低成本的执行计划. 如果SQL plan bas ...
- Oracle 11g 新特性 --SQL Plan Management 说明
Oracle 11g 新特性 --SQL Plan Management 说明 参见大神博主文章: http://blog.csdn.net/tianlesoftware/article/detail ...
- SQL Server Management Studio 执行超大脚本文件
SQL Server Management Studio 执行超大脚本文件 启动cmd.exe , cd 到C:\Program Files (x86)\Microsoft SQL Server\11 ...
- 存储过程被程序和第三方客户端执行很慢,而sql server management studio执行速度正常
来自:http://blog.csdn.net/pgbiao/article/details/22388945 原因分析:由于存储过程是预编译的, 在第一次执行的时候, 会生成执行计划, 以后执行的时 ...
- 官方文档:11G新特性SQL PLAN BASLINE 执行计划基线
什么是SQL执行计划管理? SQL计划管理(SQL plan management)是一咱预防机制,记录和评估SQL语句的执行计划.SQL plan management的主要功能是sql plan ...
- SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?
前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...
随机推荐
- 【转载】TCP慢启动、拥塞避免、快速重传、快速回复
转载自:TCP慢启动.拥塞避免.快速重传.快速回复 转自:http://blog.csdn.net/itmacar/article/details/12278769 感谢博主的辛勤成果! 为了防止网络 ...
- UVa 815 洪水!
https://vjudge.net/problem/UVA-815 题意:一个n*m的方格区域,共有n*m个方格,每个方格是边长为10米的正方形,整个区域的外围是无限高的高墙,给出这n*m个方格的初 ...
- confluence导出pdf 文字显示不全
当使用confluence编辑页面时,当一行的文字过多,且中间没什么逗号分隔时,有时会出现导出的pdf文件中,这一行显示的文字不全的情况. 如: 很明显费用的费字没有显示完全,且后面还有其他的字. 可 ...
- 利用JSP中的过滤器解决中文乱码问题
首先我们创建过过滤器: package com.gbx; import java.io.IOException; import javax.servlet.Filter; import javax.s ...
- Spring boot 中Hibernate 使用
spring.jpa.properties.hibernate.hbm2ddl.auto=有四种配置方式,分别如下: 是hibernate的配置属性,其主要作用是:自动创建.更新.验证数据库表结构.该 ...
- 软件测试实习生 带人计划 Plan for Training Inten
临时拟了个提纲,以后慢慢补充吧 序号 培训内容 时间安排 1 根据项目需求,编写测试用例,针对存储过程 2 存储过程的走读,以及怎样执行测试用例和查看结果 3 根据项目需求,编写测试用例,针对接口[C ...
- InChat版,仅仅两个接口实现自己的IM系统(可兼容)
InChat 一个IM通讯框架 一个轻量级.高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架.(核心底层Netty) 版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查 ...
- java编程思想之并发(死锁)
一个对象可以有 synchronized 方法或其他形式的加锁机制来防止别的任务在互斥还没有释放的时候就访问这个对象. 死锁 任务有可能变成阻塞状态,所以就可能发生这样的情况:某个任务在等待另一个任务 ...
- ninja install error
ninja install ...... CMake Error at cmake_install.cmake:36 (FILE): file INSTALL cannot find " ...
- ZendFramework中实现自动加载models
最近自学Zendframework中,写Controller的时候总要require model下的类文件,然后才能实例化,感觉非常不爽 Google了许久,找到个明白人写的方法不错,主要就是修改ap ...