当前位置: 首页 > news >正文

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(@"SEL$1" "ZZH_OB"@"SEL$1")
      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(@"SEL$1" "ZZH_OB"@"SEL$1")',
     '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;

http://www.lryc.cn/news/514011.html

相关文章:

  • 数字电路期末复习
  • 正则表达式 - 使用总结
  • 通过Xshell远程连接wsl2
  • 【ubuntu】安装OpenSSH服务器
  • CESS 的 2024:赋能 AI,塑造去中心化数据基础
  • Redission红锁
  • 使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色
  • Spring Boot AOP日志打印实现
  • Windows远程--如何使用IP访问服务器
  • vscode中设置默认格式化工具pretter
  • Hadoop、Flink、Spark和Kafka
  • APP自动化测试元素定位及隐式等待
  • Element plus 的 upload 组件实现自定义上传
  • 力扣-数据结构-10【算法学习day.81】
  • WPF的一些控件的触发事件记录
  • C# 设计模式(创建型模式):建造者模式
  • 关于模板函数的void返回值的判断:std::is_void与模板特化
  • 重现ORA-01555 细说Oracle Undo 数据管理
  • 通过blob请求后端导出文件
  • 养老院小程序怎么搭建?让老年人老有所养,老有所依!
  • 【2024美国数学建模AB题原文翻译】
  • 判断旗帜是否符合ISO新标准
  • 海量数据存储实现方案设计1-mycat版
  • Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)
  • hot100_238. 除自身以外数组的乘积
  • 软件测试基础详解
  • MySQL 备份方案设计之准备事项
  • 《计算机网络A》单选题-复习题库解析-最终
  • 向 SwiftUI 视图注入 managedObjectContext 环境变量导致 Xcode 预览(Preview)崩溃的解决
  • Ruby 数据类型