根据sql_id生成sql profile

本文介绍如何在Oracle数据库中使用OUTLINE和SQL Profile来稳定特定SQL语句的执行计划。通过获取SQL ID对应的OUTLINE信息,并利用PL/SQL过程创建SQL Profile,确保执行计划的一致性和最优性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际工作中经常出现SQL执行计划总变的状况,在9i及之前版本常用OUTLINE稳定执行计划,10G后可以使用更优的sql profile[@more@]

1、获取某一sql_id的OUTLINE

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('ct47hsv47278w', 0, 'outline'));

这里只贴出了outline的部分,其余略

Outline Data
-------------

/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('10.2.0.5')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
INDEX_RS_ASC(@"SEL$1" "A"@"SEL$1" "IDX_TF_B_PAYLOG_1")
INDEX_RS_ASC(@"SEL$1" "F"@"SEL$1" ("TD_M_STAFF"."STAFF_ID"))
INDEX_RS_ASC(@"SEL$1" "C"@"SEL$1" ("TD_B_DISCNT_ACTION"."ACTION_CODE"))
INDEX_RS_ASC(@"SEL$1" "D"@"SEL$1" ("TD_B_IDTONAME"."PARA_ID" "TD_B_IDTONAME"."INFO_TYPE"))
INDEX_RS_ASC(@"SEL$1" "B"@"SEL$1" ("TF_B_PAYOTHER_LOG"."CHARGE_ID" "TF_B_PAYOTHER_LOG"."PARTITION_ID"
"TF_B_PAYOTHER_LOG"."CARRIER_ID"))
LEADING(@"SEL$1" "A"@"SEL$1" "F"@"SEL$1" "C"@"SEL$1" "D"@"SEL$1" "B"@"SEL$1")
USE_NL(@"SEL$1" "F"@"SEL$1")
USE_NL(@"SEL$1" "C"@"SEL$1")
USE_NL(@"SEL$1" "D"@"SEL$1")
USE_NL(@"SEL$1" "B"@"SEL$1")
END_OUTLINE_DATA
*/

2、创建sql profile
DECLARE
V_HINTS SYS.SQLPROF_ATTR;
CURSOR C1 IS
SELECT *
FROM V$SQL
WHERE SQL_ID = 'ct47hsv47278w'
AND CHILD_NUMBER = 0;
L_C1 C1%ROWTYPE;
BEGIN
V_HINTS := SYS.SQLPROF_ATTR(
'BEGIN_OUTLINE_DATA',
'IGNORE_OPTIM_EMBEDDED_HINTS',
'OPTIMIZER_FEATURES_ENABLE(''10.2.0.5'')',
'ALL_ROWS',
'OUTLINE_LEAF(@"SEL$1")',
'INDEX_RS_ASC(@"SEL$1" "A"@"SEL$1" "IDX_TF_B_PAYLOG_1")',
'INDEX_RS_ASC(@"SEL$1" "F"@"SEL$1" ("TD_M_STAFF"."STAFF_ID"))',
'INDEX_RS_ASC(@"SEL$1" "C"@"SEL$1" ("TD_B_DISCNT_ACTION"."ACTION_CODE"))',
'INDEX_RS_ASC(@"SEL$1" "D"@"SEL$1" ("TD_B_IDTONAME"."PARA_ID" "TD_B_IDTONAME"."INFO_TYPE"))',
'INDEX_RS_ASC(@"SEL$1" "B"@"SEL$1" ("TF_B_PAYOTHER_LOG"."CHARGE_ID" "TF_B_PAYOTHER_LOG"."PARTITION_ID"
"TF_B_PAYOTHER_LOG"."CARRIER_ID"))',
'LEADING(@"SEL$1" "A"@"SEL$1" "F"@"SEL$1" "C"@"SEL$1" "D"@"SEL$1" "B"@"SEL$1")',
'USE_NL(@"SEL$1" "F"@"SEL$1")',
'USE_NL(@"SEL$1" "C"@"SEL$1")',
'USE_NL(@"SEL$1" "D"@"SEL$1")',
'USE_NL(@"SEL$1" "B"@"SEL$1")',
'END_OUTLINE_DATA'
);

OPEN C1;
FETCH C1
INTO L_C1;

DBMS_SQLTUNE.IMPORT_SQL_PROFILE(L_C1.SQL_FULLTEXT,
V_HINTS,
'sqlprofile_ct47hsv47278w', --sql profile名字
FORCE_MATCH => TRUE,
REPLACE => TRUE);
CLOSE C1;
END;
/

3、相关视图
<1>SYS.SQLPROF$ATTR
<2>DBA_SQL_PROFILES

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/717880/viewspace-1060378/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/717880/viewspace-1060378/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值