Oracle 使用 sql profile 固定执行计划

测试使用 sql profile 固定执行计划:

Oracle 10g之前有outlines,10g之后 sql profile 。如果针对非绑定变量的sql,outlines则效果不佳,不建议使用 。

1、准备测试用表

SQL> create table zzh_ob as select * from dba_objects;

SQL> create index ind_obid on zzh_ob(object_id);

SQL> select object_id from zzh_ob where rownum<2;

OBJECT_ID


16

SQL> exec dbms_stats.gather_table_stats(user,'zzh_ob',cascade=>true);

原sql执行计划:

SQL> set autot trace explain

SQL> select * from zzh_ob where object_id=16;

Execution Plan


Plan hash value: 3485916696


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |


| 0 | SELECT STATEMENT | | 1 | 127 | 2 (0)| 00:00:01 |

| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| ZZH_OB | 1 | 127 | 2 (0)| 00:00:01 |

|* 2 | INDEX RANGE SCAN | IND_OBID | 1 | | 1 (0)| 00:00:01 |


Predicate Information (identified by operation id):


2 - access("OBJECT_ID"=16)

新sql执行计划

SQL> select /*+ full(zzh_ob) */ * from zzh_ob where object_id=16;

Execution Plan


Plan hash value: 474274488


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |


| 0 | SELECT STATEMENT | | 1 | 127 | 388 (1)| 00:00:01 |

|* 1 | TABLE ACCESS FULL| ZZH_OB | 1 | 127 | 388 (1)| 00:00:01 |


Predicate Information (identified by operation id):


1 - filter("OBJECT_ID"=16)

2、获取新sql的sql_id

SQL> col sql_id for a20

SQL> col sql_text for a120

SQL> select sql_id,sql_text from v$sql where sql_text like '%full(zzh_ob)%';

SQL_ID SQL_TEXT


g5btxvsh51ct5 EXPLAIN PLAN SET STATEMENT_ID='PLUS1200001' FOR select sql_id,sql_text from v$sql where sql_text like '%full(zzh_ob)%'

4kn9w9q3xf73k EXPLAIN PLAN SET STATEMENT_ID='PLUS1200001' FOR select /*+ full(zzh_ob) */ * from zzh_ob where object_id=16

68x7hd7uaqqk1 select sql_id,sql_text from v$sql where sql_text like '%full(zzh_ob)%'

1syfgv2q5ggn2 select /*+ full(zzh_ob) */ * from zzh_ob where object_id=16

3、获取新sql的outline

SQL> set pagesize 1000

SQL> select * from table(dbms_xplan.display_cursor('1syfgv2q5ggn2',null,'outline'));

PLAN_TABLE_OUTPUT


SQL_ID 1syfgv2q5ggn2, child number 0


select /*+ full(zzh_ob) */ * from zzh_ob where object_id=16

Plan hash value: 474274488


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |


| 0 | SELECT STATEMENT | | | | 388 (100)| |

|* 1 | TABLE ACCESS FULL| ZZH_OB | 1 | 127 | 388 (1)| 00:00:01 |

PLAN_TABLE_OUTPUT



Outline Data


/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE('19.1.0')

DB_VERSION('19.1.0')

ALL_ROWS

PLAN_TABLE_OUTPUT


OUTLINE_LEAF(@"SEL$1")

FULL(@"SEL1" ["ZZH_OB"@"SEL1](mailto:)")

END_OUTLINE_DATA

*/

Predicate Information (identified by operation id):


1 - filter("OBJECT_ID"=16)

32 rows selected.

4、创建sql profile(SQLPROFILE_01)

SQL> declare

v_hints sys.sqlprof_attr;

begin

v_hints:=sys.sqlprof_attr(

'BEGIN_OUTLINE_DATA',

'IGNORE_OPTIM_EMBEDDED_HINTS',

'OPTIMIZER_FEATURES_ENABLE(''19.1.0'')',

'DB_VERSION(''19.1.0'')',

'ALL_ROWS',

'OUTLINE_LEAF(@"SEL$1")',

'FULL(@"SEL1" ["ZZH_OB"@"SEL1")'](mailto:),

'END_OUTLINE_DATA');

dbms_sqltune.import_sql_profile(

'select * from zzh_ob where object_id=16',

v_hints,'SQLPROFILE_01',

force_match=>true,replace=>false);

end;

/

5、查看是否使用 sql profile

SQL> set autot trace explain

SQL> select * from zzh_ob where object_id=16;

Execution Plan


Plan hash value: 474274488


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |


| 0 | SELECT STATEMENT | | 1 | 127 | 388 (1)| 00:00:01 |

|* 1 | TABLE ACCESS FULL| ZZH_OB | 1 | 127 | 388 (1)| 00:00:01 |


Predicate Information (identified by operation id):


1 - filter("OBJECT_ID"=16)

Note


  • SQL profile "SQLPROFILE_01" used for this statement

Statistics


247 recursive calls

0 db block gets

1544 consistent gets

2 physical reads

0 redo size

2685 bytes sent via SQL*Net to client

401 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

11 sorts (memory)

0 sorts (disk)

1 rows processed

查询已经创建的 sql profile :

SELECT name, created, category, sql_Text from dba_sql_profiles ORDER BY created DESC;

相关推荐
2401_873479402 分钟前
如何识别代理IP和伪装流量?用IP情报工具三步穿透住宅代理伪装
网络·数据库·网络协议·tcp/ip·ip
诚信定制83910 分钟前
如何启动 Redis 服务:详细步骤指南
数据库·redis·缓存
AllData公司负责人10 分钟前
数据同步平台|AIIData数据中台实现MySQL、Hive、Kafka 一键接入Doris
大数据·数据库·hive·mysql·kafka·实时同步
Edward1111111113 分钟前
一AI名词
java·开发语言·数据库·学习
hey you~20 分钟前
400电话选型技术测评:一个开发视角的线路质量评估方案
运维·网络·数据库·400电话·企业通信
Database_Cool_32 分钟前
实时计数器/排行榜首选:阿里云 Tair 高并发数据结构实践
数据结构·数据库·阿里云·云计算
言乐635 分钟前
Python视频相对亮度检测
数据库·python·计算机视觉·小程序·音视频
snow@li1 小时前
中台:中台即复用 / 理解企业架构中的能力抽象与分层共享 / 中台体系全景梳理 / 共性能力抽象、沉淀并复用
数据库
SelectDB技术团队1 小时前
AB 实验指标计算场景:Apache Doris / SelectDB 的技术能力、选型对比与实践
大数据·数据库·数据分析·apache·用户运营·apache doris·selectdb
snow@li1 小时前
数据库:B+ 树 / 数据库索引的底层支柱
数据库