首页 > 其他分享 >HINT的作用及书写要求

HINT的作用及书写要求

时间:2023-10-17 11:01:34浏览次数:25  
标签:要求 示例 书写 HINT 如下 关键字 所示 失效

什么是HINT及其作用

HINT(提示)是出现在SQL语句的特定位置的一种特殊注释,它主要用于向Oracle数据库优化器传递指令,从而为SQL选择特定的执行计划。但是,当优化器无法按照HINT生成特定的执行计划时,它会忽略HINT。另外,也不是所有的HINT都是影响优化器和执行计划的。比如GATHER_PLAN_STATISTICS、MONITOR等提示。
“出现在SQL语句的特定位置”是指HINT必须紧跟在如下关键字的后面:SELECT, UPDATE, INSERT, MERGE, DELETE;
“一种特殊注释”是指其书写的方法,与一般注释不同。一般的注释是以/
* */或 -- 来标记,而HINT是使用 /*+ */ 和 --+ (多了一个加号)的方式来书写。正是多的这一个加号,使其从注释,华丽地转身成为影响优化器行为的HINT。注意--+的这种写法,会导致其后这一行上的所有字符,都被认为是HINT,所以,如果并不是这样,注意将HINT内容与其它代码写到不同行上。

可以通过查询数据字典v$sql_hint来获取完整的HINT内容。

此外,HINT的书写,也有一定的要求,如果违反了相关要求,会导致HINT部分或全部失效。具体要求如下:

  • “+”(加号)必须紧跟在注释分隔符(即/*或--)之后,中间不能有空格。
  • HINT与HINT之间,至少要有一个空格。
  • 对于可以引用具体对象的HINT,在引用具体对象时,不可以指定其属主名。
  • 当SQL中的表存在别名时,在HINT中对其引用时,只可以引用别名。
  • 相互矛盾的HINT会被弃用,而不是择一使用。
  • 如果在HINT中出现保留关键字,则保留关键字之后的HINT失效。

测试验证

下面,我们通过一些简单的示例,来展示HINT的作用,以及不同书写方式或错误,可能带来的影响。

示例1:HINT影响执行计划的行为

HINT的作用及书写要求_执行计划


如上图中红框所示,我们可以看到这条SQL的执行计划中,用到了索引。

我们可以通过添加适当的提示,改变执行计划,使其不使用索引,而是全表扫描。如下图所示:

HINT的作用及书写要求_优化_02

示例2:“+”号没有紧跟在注释分隔符之后,导致HINT失效

HINT的作用及书写要求_SQL_03


如上图所示,HINT并没有发挥作用。而且,HINT书写错误,并不会导致报错,因为其形式上,就是注释。

示例3:HINT要跟在紧在如下关键字的后面:SELECT, UPDATE, INSERT, MERGE, DELETE,除空格外,不应用其它字符出现。

如下例中,就是在SELECT和HINT之间,出现了“*”号:

HINT的作用及书写要求_执行计划_04

示例4:HINT中引用对象时,不可以指定其属主名。

比如前边示例中用到的表T1,其是DEMO用户下的表。如果我们在HINT中引用T1时,写成DEMO.T1,则会导致HINT失效。如下图所示:

HINT的作用及书写要求_hint_05

示例5:HINT中引用的表,在SQL中存在别名时,要使用别名。

否则会导致HINT失效。如下图所示:

HINT的作用及书写要求_hint_06


引用表别名时,HINT是生效的。而不引用表别名时,HINT是失效的,如下图所示:

HINT的作用及书写要求_SQL_07

示例6:相互矛盾的HINT会被均被弃用

如下图所示,我们使用相关提示,让执行计划对目标索引使用快速全扫的访问方式:

HINT的作用及书写要求_hint_08

同时,我们也可以继续使用前边全表扫描的HINT,让执行计划不使用索引,如下图所示:

HINT的作用及书写要求_SQL_09

但是,当我们将上述两个HINT同时写到一起时,则两个HINT均被弃用了。结果是在哪个都没用。如下图所示(注意,虽然使用了目标索引,但访问的方法不是快速全扫,而是范围扫描):

HINT的作用及书写要求_SQL_10

示例7:保留关键字之后的HINT会失效

保留关键字的清单,可以查询v$reserved_words数据字典。其中“create”就是其中的一个保留关键字。当我们把它写到HINT的前面,则后面的HINT就失效了。如下图所示:

HINT的作用及书写要求_执行计划_11

当我们把它写到中间时,则前边的HINT有效,后边的则失效。如下图所示:

HINT的作用及书写要求_hint_12


如上所示,在前边的测试中,我们知道,这两个HINT是相互矛盾的,应该都会被弃用,但这里的结果,可以看到,是保留关键字后面的HINT失效了。这里要特别提醒,因为逗号也是保留关键字,所以,在书写HINT时,特别是多个HINT时,HINT与HINT之间,只要使用空格分隔,不要用逗号分隔。这也会导致第一个逗号之后的HINT失效。如下图所示:

HINT的作用及书写要求_hint_13

但是,如果单个HINT中的参数支持使用逗号,则该逗号不影响后续的HINT。如下图所示:

HINT的作用及书写要求_hint_14

回顾总结

1、HINT可以影响SQL的执行计划和处理行为。
2、HINT需要出现在指定的位置(特定关键字SELECT, UPDATE, INSERT, MERGE, DELETE之后),并使用指定的写法(/*+ */ 或 --+)。
3、书写或使用HINT不当,会导致HINT失效。

标签:要求,示例,书写,HINT,如下,关键字,所示,失效
From: https://blog.51cto.com/u_13482808/7901080

相关文章

  • 安装Linux系统对硬件的要求
    很多初学者在安装Linux系统时,都对自己的电脑配置存在质疑,担心其是否能够满足安装Linux的要求。本节就从CPU、内存、硬盘、显卡等这些方面,详细介绍一下安装Linux系统的最低配置。基于硬件的快速发展以及操作系统核心功能的增加,势必将淘汰掉一批老旧的电脑,它们已经没有能力负......
  • # 定义函数,单个自变量+单个序列(独热编码)控制变量 # curve_fit函数要求X中的元素都是
    importnumpyasnpimportpandasaspdfromscipy.optimizeimportcurve_fit#定义函数,单个自变量deffun_exp(X,k):a,x,b=XY=a*np.exp(k*x)+breturnY#读取数据df_test=pd.DataFrame([[300,0,30,300],[3......
  • GitHub要求2FA?不慌,有它们帮你
    近日,GitHub宣布,到2023年底,所有用户都必须要启用双因素身份验证(2FA),不能只用密码啦。正如GitHub的首席安全官MikeHanley所指出的那样,保护开发者账号是确保软件供应链安全的重要一环,因为软件供应链的起点就在于开发者。启用双重身份认证(2FA)后,用户需要通过一次性密码(OTP......
  • 博客笔记要求
    笔记风格的三条建议:结构清晰、细化(看着舒服便于查找)typota风格设置,善用引用、序号、点(看着美观)多放图片,大小合适和大小一致(看着美观)笔记内容的三条建议:保证内容正确性,多测试(集百家之言并有自己理解)(1)看懂(2)善用比喻能讲懂(3)总结经验尽量用自己的代码做测试(便于理解和......
  • 1789_MIT 6.828 实验室3:用户环境要求翻译
            全部学习汇总:GreyZhang/g_unix:somebasiclearningaboutunixoperatingsystem.(github.com)简介在这个实验室中,您将实现运行受保护的用户模式环境(即“进程”)所需的基本内核功能。您将增强JOS内核,以设置数据结构来跟踪用户环境,创建单个用户环境,将程序映像加......
  • 一次性按要求替换多个文件的名称:PowerShell
      本文介绍基于PowerShell语言,对文件夹中全部文件的名称加以批量替换、修改的方法。  在之前的文章Python批量自动修改大量文件的名称中,我们介绍了基于Python语言,批量修改大量文件的名称的方法。当时我们修改文件名的需求比较复杂,因此选择了用Python语言来实现;而在我们的需求......
  • Kafka不能满足我们的要求,其尤其表现在低延迟和高可靠性方面
    为什么选择RocketMQ|RocketMQhttps://rocketmq.apache.org/zh/docs/为什么RocketMQ​在阿里孕育RocketMQ的雏形时期,我们将其用于异步通信、搜索、社交网络活动流、数据管道,贸易流程中。随着我们的贸易业务吞吐量的上升,源自我们的消息传递集群的压力也变得紧迫。根据我们......
  • 关于 GitHub 强制要求 2FA
    GitHub要求用户在今年年底之前开启双身份验证我认为这样做虽然让账号更安全,但是很浪费时间而且我是一个初中生,很多时候手机不在身边,于是就无法登录GitHub在学校就更不可能登上GitHub了这是我的一封邮件的部分内容:Bysavingyourrecoverycodes,you’llbeabletoreg......
  • 大学生职业生涯规划书书写格式
    关于封面封面采用学校下发模板或自行设计。Word设置本文采用MSOffice中的Word软件进行编辑。关闭自动编号点击【文件】-【选项】根据下图序号和红框操作格式设置布局设置页边距:上:2.54CM下:2.54CM左:2.7CM右:2.7CM字体设置第一层采用黑体,字体大小同正文,采用......
  • BOSHIDA DC电源模块对效率的要求
    BOSHIDADC电源模块对效率的要求DC(直流)电源模块是电子设备中常用的电源,用于将交流电转换为稳定的直流电。在电源模块的设计中,效率是一个非常关键的因素。电源模块的效率是指在将电能转换为输出能量时,实际输出能量占输入电能的比例。因此,效率越高,就能够在相同输入功率的情况下产生......