老张拉呱: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详解相关推荐

  1. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

  2. Spark 3.2.0 版本新特性 push-based shuffle 论文详解(一)概要和介绍

    前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...

  3. Spark 3.2.0 版本新特性 push-based shuffle 论文详解(二)背景和动机

    前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...

  4. java8 stream遍历_Java8新特性:Stream流详解

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...

  5. java lambda表达式详解_Java8新特性:Lambda表达式详解

    在 Java 版本的历次更新迭代中,Java8 是一个特殊的存在,与以往的版本升级不同.我们对 Java8 似乎抱有更大的期待,因为它是 Java5 之后最重要的一次升级,提供了十多个新特性,其中 L ...

  6. java lambda表达式详解_java8新特性-Lambda表达式的详解(从0开始)

    这几天复习了java8的一些新特性,作为一个从java5以来最具革命性的版本,一直没有来得及总结.本系列文章主要是从<java8实战>总结的.这是第一篇文章主要介绍java8的lambda ...

  7. H5的新特性及部分API详解

    h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等  对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能 ...

  8. 【Java 8 新特性】Java Clock 详解

    Java Clock 详解 systemDefaultZone millis instant offset system systemUTC tick tickMillis tickSeconds t ...

  9. oracle中pdb,Oracle 12C新特性-CDB和PDB 详解

    最近看到好多人都在尝试Oracle中的12C新特性-容器数据库,今年3月Orcle推出了Release2版本,可以算是一个稳定版本了.下午着手尝试了一下,还是蛮不错得 1.前言 CDB与PDB是Ora ...

最新文章

  1. wamp配置虚拟域名
  2. 2020 ICPC 济南 F. Gcd Product
  3. Mycat - 数据库分库分表中间件,国内最活跃的、性能最好的开源数据库中间件
  4. 95-847-042-源码-Netty-NettyServer创建
  5. Android 存储路径浅析
  6. 构造方法内的多态问题
  7. PRD之道:4个撰写PRD的关键思路
  8. 创建数据库索引的几种方法
  9. WinRAR去除打开后弹出广告的方法
  10. After Effect弹性表达式的用法
  11. Open vSwitch: Provider 网络
  12. devc++工程提示“源文件未编译”的可能问题
  13. 神经网络未来发展趋势,神经网络未来发展前景
  14. 搜索python设计题的微信公众号_appium+python自动化42-微信公众号 (可能以后会遇到也遇到切换不了webview的问题 记录再此 还没试)...
  15. Python os.symlink创建软链接
  16. 番茄学习--番茄工具推荐
  17. LeetCode 6009. 使两字符串互为字母异位词的最少步骤数
  18. itchat与微软小冰的碰撞!--微软小冰接入itchat实现微信自动回复
  19. 【转】想到他再看不到自己英俊的脸,方继藩就心肝儿疼
  20. 【修真院pm小课堂】登录注册的触发场景

热门文章

  1. 分类器构筑_为组织构筑基于区块链的未来做准备
  2. (50)常见命名方式
  3. (43)前端工程化总结
  4. HTML map元素
  5. remote API和regular API 的区别
  6. php mysql数据库同步_实现MySQL数据库同步实例演示_MySQL
  7. xcode 工程没有模拟器_Xcode只允许我运行iOS设备(没有模拟器)
  8. 怎么用纸做圆形的盒子_如何培养孩子逻辑思维能力?抓住0-8岁关键期,聪明的家长这样做...
  9. 安装.Net Standard 2.0, Impressive
  10. 20145226夏艺华 《Java程序设计》预备作业3