19c 新特性: Hint Usage Reports详解
老张拉呱:thomas zhang,甲骨文云平台事业部资深技术顾问,2008年加入甲骨文公司数据库咨询部门,10+年甲骨文解决方案咨询支持经验,资深系统工程师、Oracle OCM认证专家,具有丰富的Cloud /IT项目经验。目前主要负责甲骨文中国北方区(医院/卫生、交通、制造、教育、政府、证券、媒体、金融、零售等行业)客户的数据库、中间件、IaaS/PaaS、集成系统等相关技术解决方案咨询工作。
签名:我为人人,人人为我,三人行,必有我师。
新浪微博:http://weibo.com/tomszrp
Oracle Hints 是 SQL语句中的注释机制,用来传递指令给 Oracle 数据库优化器,告诉优化器按照我们的告诉它的方式 选择执行计划,除非存在某种条件阻止优化器这样做,典型的比如设置了 OPTIMIZER_IGNORE_HINTS、OPTIMIZER_IGNORE_PARALLEL_HINTS 参数或发生了查询转换甚至 Hint 冲突,那么可能会导致 Hint 失效。
最早在 Oracle Database 7 中就引入了 Hint,那时候当优化器生成执行计划时,用户几乎没有什么可以求助的资源。不像现在 Oracle 数据库中提供了丰富的优化工具,典型的比如SQL Tuning Advisor、SQL plan management以及SQL Performance Analyzer 等等,从而可以帮助我们解决优化器无法解决的性能问题。
Oracle 建议尽量使用这些辅助的调优工具而不是 Hint,一是这些调优工具比 Hint 更加系统、全面、有效,二是当用了很多 Hint 后,在数据和数据库环境发生变化时,可能带来新的问题,也就是说使用 Hint 可能能带来短期好处,但不会长期持续提高性能。
所以,常规的使用 Hint 的场景应该是:当收集了相关的统计信息后,在不用 hints 使用 explain plan 评估了执行计划以后才应该谨慎使用。对于一些不得不用的在实际环境中,也可能经常面临这样的问题:比如语法不正确或 Hint 使用不当,系统不会给我们任何错误提示。所以很多时候可能也就“稀里糊涂”的、一顿“猛药”下去,"病"好了,哈哈。
随着 Oracle Database 19c 的发布,优化器有一个新的重要的增强:Hint Usage report,它可以报告 hint 的使用情况,该报告包括所有优化器提示的状态,包括 PARALLEL 和 INMEMORY。
Hint Usage report 会显示使用和忽略了哪些提示,并通常解释为什么忽略提示。忽略提示最常见的原因有语法错误(Syntax errors)、不正确的Hint(Unresolved hints)、冲突(Conflicting hints)、受影响的hint(Hints affected by transformations)等,我这里通过dbms_xplan来快速体验一下。
DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
cursor_child_no IN NUMBER DEFAULT 0,
format IN VARCHAR2 DEFAULT 'TYPICAL');
dbms_xplain.display_cursor大家应该经常用,不再多少。19c中新增加的flag:
+HINT_REPORT_USED 显示使用的hints
+HINT_REPORT_UNUSED 显示未使用和语法错误的hint, 缺省format=TYPICAL包含该flag,也就是会报告无效的Hint -- Invalid Hint
+HINT_REPORT 包含上面2个flag的内容,当format=ALL时自动包含该flag.
下面简单看个示例:
PDB1@ZRP>set feedback on sql_id
PDB1@ZRP>select /*+ full(test) index(nonexists) nonfunc(test) */ object_name from test where object_id=123;
OBJECT_NAME
-----------------------------------------------------------------------------------------------------------
OPQTYPE$
1 row selected.
SQL_ID: aqh25km72pgj3
PDB1@ZRP>PDB1@ZRP>select * from dbms_xplan.display_cursor(sql_id=>'aqh25km72pgj3');
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
SQL_ID aqh25km72pgj3, child number 0
-------------------------------------
select /*+ full(test) index(nonexists) nonfunc(test) */ object_name
from test where object_id=123
Plan hash value: 1357081020
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 2 (N - Unresolved (1), E - Syntax error (1))
---------------------------------------------------------------------------
1 - SEL$1
N - index(nonexists)
E - nonfunc
PDB1@ZRP>
说明:最后一部分是Hint Report,它告诉我们对于执行计划Id=1这行,查询块SEL$1有2个未使用的提示:1个是语法错误(E),因为nonfunc不是一个提示。另一个是index(),它虽然是一种有效的语法,但是它提到了一个不在查询中的别名(nonexists),然后错误被解析(N)。
下面再看一个忽略正常提示的Hint Report示例:
PDB1@ZRP>alter session set optimizer_ignore_hints=true;
Session altered.
PDB1@ZRP>select /*+ full(test) */ object_name from test where object_id=123;
OBJECT_NAME
----------------------------------------------------------------------------
OPQTYPE$
1 row selected.
SQL_ID: 1azqdh1xrf33w
PDB1@ZRP>select * from dbms_xplan.display_cursor(sql_id=>'1azqdh1xrf33w');
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------
SQL_ID 1azqdh1xrf33w, child number 0
-------------------------------------
select /*+ full(test) */ object_name from test where object_id=123
Plan hash value: 159453698
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (U - Unused (1))
---------------------------------------------------------------------------
1 - SEL$1 / TEST@SEL$1
U - full(test) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS
PDB1@ZRP>
说明:最后一部分是Hint Report告诉我们有1个未使用的提示,是因为IGNORE_OPTIM_EMBEDDED_HINTS设置被拒绝了
更多详细介绍,请大家参考SQL Tuning Guide(点击“阅读原文”)
原创:老张拉呱
资源下载
关注公众号:数据和云(OraNews)回复关键字获取
2018DTCC , 数据库大会PPT
2018DTC,2018 DTC 大会 PPT
DBALIFE,“DBA 的一天”海报
DBA04,DBA 手记4 电子书
122ARCH,Oracle 12.2体系结构图
2018OOW,Oracle OpenWorld 资料
产品推荐
云和恩墨Bethune Pro企业版,集监控,巡检,安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!
19c 新特性: Hint Usage Reports详解相关推荐
- 【java8新特性】——Stream API详解(二)
一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...
- Spark 3.2.0 版本新特性 push-based shuffle 论文详解(一)概要和介绍
前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...
- Spark 3.2.0 版本新特性 push-based shuffle 论文详解(二)背景和动机
前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...
- java8 stream遍历_Java8新特性:Stream流详解
1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...
- java lambda表达式详解_Java8新特性:Lambda表达式详解
在 Java 版本的历次更新迭代中,Java8 是一个特殊的存在,与以往的版本升级不同.我们对 Java8 似乎抱有更大的期待,因为它是 Java5 之后最重要的一次升级,提供了十多个新特性,其中 L ...
- java lambda表达式详解_java8新特性-Lambda表达式的详解(从0开始)
这几天复习了java8的一些新特性,作为一个从java5以来最具革命性的版本,一直没有来得及总结.本系列文章主要是从<java8实战>总结的.这是第一篇文章主要介绍java8的lambda ...
- H5的新特性及部分API详解
h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能 ...
- 【Java 8 新特性】Java Clock 详解
Java Clock 详解 systemDefaultZone millis instant offset system systemUTC tick tickMillis tickSeconds t ...
- oracle中pdb,Oracle 12C新特性-CDB和PDB 详解
最近看到好多人都在尝试Oracle中的12C新特性-容器数据库,今年3月Orcle推出了Release2版本,可以算是一个稳定版本了.下午着手尝试了一下,还是蛮不错得 1.前言 CDB与PDB是Ora ...
最新文章
- wamp配置虚拟域名
- 2020 ICPC 济南 F. Gcd Product
- Mycat - 数据库分库分表中间件,国内最活跃的、性能最好的开源数据库中间件
- 95-847-042-源码-Netty-NettyServer创建
- Android 存储路径浅析
- 构造方法内的多态问题
- PRD之道:4个撰写PRD的关键思路
- 创建数据库索引的几种方法
- WinRAR去除打开后弹出广告的方法
- After Effect弹性表达式的用法
- Open vSwitch: Provider 网络
- devc++工程提示“源文件未编译”的可能问题
- 神经网络未来发展趋势,神经网络未来发展前景
- 搜索python设计题的微信公众号_appium+python自动化42-微信公众号 (可能以后会遇到也遇到切换不了webview的问题 记录再此 还没试)...
- Python os.symlink创建软链接
- 番茄学习--番茄工具推荐
- LeetCode 6009. 使两字符串互为字母异位词的最少步骤数
- itchat与微软小冰的碰撞!--微软小冰接入itchat实现微信自动回复
- 【转】想到他再看不到自己英俊的脸,方继藩就心肝儿疼
- 【修真院pm小课堂】登录注册的触发场景
热门文章
- 分类器构筑_为组织构筑基于区块链的未来做准备
- (50)常见命名方式
- (43)前端工程化总结
- HTML map元素
- remote API和regular API 的区别
- php mysql数据库同步_实现MySQL数据库同步实例演示_MySQL
- xcode 工程没有模拟器_Xcode只允许我运行iOS设备(没有模拟器)
- 怎么用纸做圆形的盒子_如何培养孩子逻辑思维能力?抓住0-8岁关键期,聪明的家长这样做...
- 安装.Net Standard 2.0, Impressive
- 20145226夏艺华 《Java程序设计》预备作业3