使用SQL Profile及SQL Tuning Advisor固定运行计划
SQL Profile就是为某一SQL语句提供除了系统统计信息、对象(表和索引等)统计信息之外的其它信息,比方执行环境、额外的更准确的统计信息,以帮助优化器为SQL语句选择更适合的执行计划。
SQL Profiles可以说是Outlines的进化。Outlines可以实现的功能SQL Profiles也全然可以实现,而SQL Profiles具有Outlines不具备的优化,最重要的有二点:
SQL Profiles更easy生成、更改和控制。
SQL Profiles在对SQL语句的支持上做得更好。也就是适用范围更广。
使用SQL Profiles两个目的:
锁定或者说是稳定运行计划。
在不能改动应用中的SQL的情况下使SQL语句按指定的执行计划执行。
參考老熊的博客。链接:http://www.laoxiong.net/sql-profiles-partii.html http://www.laoxiong.net/sql-profiles-part.html http://blog.sina.com.cn/s/blog_5037eacb01011mgu.htm
1.实验环境构造语句:
create table bys.t1 as select * from dba_objects;
create index bys.t1_idx on t1(object_id);
exec dbms_stats.gather_table_stats('bys','t1',cascade=>true,degree=>4);
set autotrace trace;
select a.*,b.owner from t1 a,t1 b where a.object_name like '%T1%' and a.object_id=b.object_id;
select /*+ use_nl(a b) index(t2) */ a.*,b.owner from t1 a,t1 b where a.object_name like '%T1%' and a.object_id=b.object_id;
set autotrace off;
explain plan for select /*+ use_nl(a b) index(t2) */ a.*,b.owner from t1 a,t1 b where a.object_name like '%T1%' and a.object_id=b.object_id;
col sql_text for a100
SELECT SQL_ID,SQL_TEXT FROM V$SQL WHERE SQL_TEXT LIKE '%a.*,b.owner from t1 a,t1 b%';
####2t5xqt4d1dsaw
10g開始,v$sql_plan中就包含了SQL语句OUTLINE数据,也就是稳定运行计划的Hints。例如以下:
set pagesize 1000
SQL> select * from table(dbms_xplan.display_cursor('2t5xqt4d1dsaw',null,'outline'));
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------
SQL_ID 2t5xqt4d1dsaw, child number 0
-------------------------------------
select /*+ use_nl(a b) index(t2) */ a.*,b.owner from t1 a,t1 b where
a.object_name like '%T1%' and a.object_id=b.object_id
Plan hash value: 190596302
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 979 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 9 | 2 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 471 | 43803 | 979 (1)| 00:00:12 |
|* 3 | TABLE ACCESS FULL | T1 | 471 | 39564 | 36 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | T1_IDX | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Outline Data ----------这一部分: /*+ */ 之间的就是所需的数据了
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('10.2.0.1')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1" "A"@"SEL$1")
INDEX(@"SEL$1" "B"@"SEL$1" ("T1"."OBJECT_ID"))
LEADING(@"SEL$1" "A"@"SEL$1" "B"@"SEL$1")
USE_NL(@"SEL$1" "B"@"SEL$1")
END_OUTLINE_DATA
*/
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("A"."OBJECT_NAME" LIKE '%T1%')
4 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
###############################################################################
2.開始创建并应用SQL Profile
使用未加HINT的SQL语句,并指定SQL_PROFILE名字:SQLPROFILE_T1
注意事项:两个引號---如('10.2.0.1')要写成(''10.2.0.1'')--'%T1%'写成''%T1%''
SQL语句结尾的;不要写上,绑定变量值是'1'时,要输入''1''
declare
v_hints sys.sqlprof_attr;
begin
v_hints:=sys.sqlprof_attr(
'BEGIN_OUTLINE_DATA',
'IGNORE_OPTIM_EMBEDDED_HINTS',
'OPTIMIZER_FEATURES_ENABLE(''10.2.0.1'')',
'ALL_ROWS',
'OUTLINE_LEAF(@"SEL$1")',
'FULL(@"SEL$1" "A"@"SEL$1")',
'INDEX(@"SEL$1" "B"@"SEL$1" ("T1"."OBJECT_ID"))',
'LEADING(@"SEL$1" "A"@"SEL$1" "B"@"SEL$1")',
'USE_NL(@"SEL$1" "B"@"SEL$1")',
'END_OUTLINE_DATA');
dbms_sqltune.import_sql_profile(
'select a.*,b.owner from t1 a,t1 b where a.object_name like ''%T1%'' and a.object_id=b.object_id',
v_hints,'SQLPROFILE_T1',
force_match=>true,replace=>true);
end;
/
删除语句:
exec dbms_sqltune.drop_sql_profile(name =>'SQLPROFILE_T1' );
######
3.验证SQL语句是否使用上一步创建的SQL_PROFILE:
SQL> set autotrace trace;
SQL> select a.*,b.owner from t1 a,t1 b where a.object_name like '%T1%' and a.object_id=b.object_id;
23 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 190596302
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 471 | 43803 | 979 (1)| 00:00:12 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 9 | 2 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 471 | 43803 | 979 (1)| 00:00:12 |
|* 3 | TABLE ACCESS FULL | T1 | 471 | 39564 | 36 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | T1_IDX | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("A"."OBJECT_NAME" LIKE '%T1%')
4 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
Note
-----
- SQL profile "SQLPROFILE_T1" used for this statement
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
163 consistent gets
0 physical reads
0 redo size
2609 bytes sent via SQL*Net to client
392 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
23 rows processed 0 sorts (disk)
#####################################################################
使用Oracle的SQL Tuning Advisor固定运行计划--SQL_ID
----通过sql_id的方式 sql_id => 'a2h6pzvqncfvg',--想调优的sql_id
show serveroutput
set serveroutput on;
DECLARE
a_tuning_task VARCHAR2(30);
BEGIN
a_tuning_task := dbms_sqltune.create_tuning_task(sql_id => 'a2h6pzvqncfvg',task_name => 'tuning_test');
dbms_sqltune.execute_tuning_task(a_tuning_task);
END;
/
set long 1000
SELECT dbms_sqltune.report_tuning_task('tuning_test') FROM dual;
这里的输出中的sql_id是从v$sql查出。相应的是没有加hint的SQL。
假设SQL Tuning Advisor找到了理想的运行计划。下一步就是:Accept SQL Profile,接受这个SQL Profile。
## execute dbms_sqltune.accept_sql_profile(task_name =>'tuning_test' ,replace => TRUE,force_match=>true);
完毕后验证语句:
set autotrace trace;
select a.*,b.owner from t1 a,t1 b where a.object_name like '%T1%' and a.object_id=b.object_id;
set autotrace off;
删除SQL语句:
exec dbms_sqltune.drop_tuning_task('tuning_test');
假设未找到理想的运行计划,则參考下一个方法。
##################################################################
使用Oracle的SQL Tuning Advisor固定运行计划--使用SQL_TEXT,參考下面:
DECLARE
my_task_name VARCHAR2 (30);
my_sqltext CLOB;
BEGIN
my_sqltext := 'select * from test where OBJECT_ID=15'; --想调优的sql
my_task_name := dbms_sqltune.create_tuning_task (sql_text=> my_sqltext,
--bind_list => 'UNDO$',
--user_name => 'SONG',
--scope => 'COMPREHENSIVE',
--time_limit => 60,
task_name => 'sql_tuning_test'
--description => 'Tuning Task'
);
END;
/
exec dbms_sqltune.execute_tuning_task('sql_tuning_test'); --运行调优的任务
SELECT STATUS FROM USER_ADVISOR_TASKS WHERE task_name = 'sql_tuning_test'; --查看调优作业的状态
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('sql_tuning_test') FROM DUAL;--查看调优的建议
exec dbms_sqltune.drop_tuning_task('sql_tuning_test');--删除任务
使用SQL Profile及SQL Tuning Advisor固定运行计划的更多相关文章
- Oracle 通过sql profile为sql语句加hint
sql profile最大的优点是在不修改sql语句和会话执行环境的情况下去优化sql的执行效率,适合无法在应用程序中修改sql时.sql profile最常用方法大概是:--创建产生sql tuni ...
- Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划
固定执行计划-使用SPM(Sql Plan Management)固定执行计划 转载自:http://www.lunar2013.com/2016/01/固定执行计划-使用spm%EF%BC%88sq ...
- SQL Tuning Advisor
SQL Tuning Advisorsql调优顾问可提供的建议有:-收集对象的统计信息-创建索引-重写sql语句-创建sql profile-创建sql plan baseline SQL Tunin ...
- 如何使用coe_load_sql_profile.sql来固定sql profile
SQLT工具包含一个脚本,名字是 coe_load_sql_profile.sql,下面以用户SCOTT的EMP表为例,说明如何使用该脚本固定sql profile. 1. SQL> -- 对e ...
- 为什么需要SQL Profile
为什么需要SQL Profile Why oracle need SQL Profiles,how it work and what are SQL Profiles... 使用DBMS_XPLAN. ...
- SQL profile纵览(10g)
第一篇:介绍 10g开始,查询优化器(Query optimizer)扩展成自动调整优化器(Automatic Tuning Optimizer).也就是扩展了功能.此时,我们就可以让 ...
- SQL Profile (总结4)--使用演示示例
前提:sql profile工具的相关视图 dba_sql_profile 10g: sys.sqlprof$attr & sqlprof$ 11g: sys.sqlobj$data & ...
- SQL Server如何固定执行计划
SQL Server 其实从SQL Server 2005开始,也提供了类似ORACLE中固定执行计划的功能,只是好像很少人使用这个功能.当然在SQL Server中不叫"固定执行计划&qu ...
- 【故障处理141119】一次数据库不繁忙时一条sql语句2个运行计划导致业务超时的故障处理
1,故障描写叙述: 一条select有两个运行计划.在sqlplus中运行选择好的运行计划.仅仅要40毫秒.而在程序中运行选择了差的运行计划,要1分23秒左右,导致前台业务超时报错. 2.故障解决: ...
随机推荐
- 几个不同的tab切换示例
上一篇<论tab切换的几种实现方法>中讲了tab切换的4种不同实现原理,那么,现在到理论联系实际的时候了,下面就写几个实例. 一.仿”中国人民大学“官网的tab切换,背景是图片,效果图如下 ...
- Knockout应用开发指南(完整版) 目录索引(转)
使用Knockout有一段时间了(确切的说从MIX11大会宣传该JavaScript类库以来,我们就在使用,目前已经在正式的asp.net MVC项目中使用),Knockout使用js代码达到双向绑定 ...
- hibernate一对多查询
一对多查询 1,同时添加老师和学生案例 在进行具有关联关系的对象同时添加时 首先绑定对像间的关系 ---将多方关联一方 ---将一方关联多方 然后全部添加 备注: 1,保存老师对象时, 由于设置了学生 ...
- 理解 CSS 布局和块级格式上下文
前言 BFC 的概念始于 CSS2,是个蛮古老的 CSS 话题了,网上也到处能搜到 BFC 的介绍,但是都不够简洁.本文系翻译自 Rachel Andrew 女士的博文 Understanding C ...
- Python中*args和**kwargs的使用
函数定义 使用*args和**kwargs传递可变长参数: *args用作传递非命名键值可变长参数列表(比如元组) **kwargs用作传递键值可变长参数列表(比如字典) 函数入参 *args 传递一 ...
- windows 下完全卸载service
用SC Delete命令的话,如果服务名称中带空格,则请在服务名称前面用半角的双引号括起,如SC delete "Adobe LM Service",另外Services这个子键一 ...
- Qt 5.8.3 部署/添加 Crypto++第三方库(5.6.5版本)
首先,Qt没有封装加解密算法库(其实有个哈希函数的函数).介于OpenSSL函数封装不友好,以及先前爆发的心脏滴血漏洞广受诟病,我们考虑在C++上使用一种新的,并且封装友好的,OOAD程度更高的加解密 ...
- Vue课程思维导图
- 15Microsoft SQL Server 数据库维护
Microsoft SQL Server 数据库维护 2.6.1数据库联机与脱机 --联机:该状态为数据库正常状态,也就是我们常看到的数据库的状态,该状态下的数据库处于可操作状态,可以对数据库进行任何 ...
- 字符串--P1308 统计单词数
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...