Oracle Hint 语法详解

什么是Hint

Hint 是 Oracle 提供的一种 SQL 语法,它允许用户在 SQL 语句中插入相关的语法,从而影响 SQL 的执行方式。
因为 Hint 的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是 Oracle 提供给 DBA 用来分析诊断问题的工具 。

导致 Hint 失效的原因

在使用 Hint 时需要注意的一点是,并非任何时刻 Hint 都起作用。 导致 HINT 失效的原因有如下 2 点:

(1) 如果 CBO 认为使用 Hint 会导致错误的结果时,Hint 将被忽略。
(2) 如果表中指定了别名,那么 Hint 中也必须使用别名,否则 Hint 也会忽略。

SQL>Select /*+full(a)*/ * from t a; -- 使用 hint
SQL>Select /*+full(t) */ * from t a; --不使用 hint

Hint 使用规则及注意事项

1、hint 其实是一种注释,如果目标 SQL 的文本出现了 hint,则优化器会选择 hint 的执行计划,而不会考虑
最优的执行计划,但前提是这个 HINT 是可选的执行计划之一。

2、hint 的用法:必须紧随关键字 select、insert、update,delete 后,hint 中第一个星号和加号之间不能有空格,一般写法 /*+ gather_plan_statistics */,如果有两个 hint,用空格隔开。hint 中指定具体对象时,不能带上该对象所在 schema 的名称。即使该 sql 文本中已经有对应的 schema的名称。

在 hint 中指定具体表名时,如果该表在对应 sql 文本中有别名,则应该使用该表的别名。oracle 数据库中的query block 是指一个语义上完整的查询语句,hint 生效范围仅限于它本身所在的 query block。如果一个语句有子查询,那么主查询的 hint 只能作用于主查询,如果想让 Hint 作用于子查询,那么 hint 要加在子查询上。

Hint 的功能划分

可以分成如下几类:
在这里插入图片描述

Hint使用示例

1、和优化器相关的 Hint
SQL> select /*+ all_rows */ * from scott.emp;
SQL> select /*+ first_rows(20) */ * from scott.emp;
SQL> select /*+ rule */ * from scott.emp;
2、访问路径相关的 Hint

这一部分 hint 将直接影响 SQL 的执行计划,所以在使用时需要特别小心。 该类 Hint 对 DBA 分析 SQL 性能
非常有帮助,DBA 可以让 SQL 使用不同的 Hint 得到不同的执行计划,通过比较不同的执行计划来分析当前 SQL性能。

FULL Hint
该 Hint 告诉优化器对指定的表通过全表扫描的方式访问数据。
示例:

SQL> select /*+full(emp) */ * from emp;

要注意,如果表有别名,在 hint 里也要用别名, 这点在前面已经说明。

INDEX Hint
Index hint 告诉优化器对指定的表通过索引的方式访问数据,当访问索引会导致结果集不完整时,优化器会忽略这个 Hint。
示例:

SQL> select /*+index(emp index_emp) */ * from emp where id>1;

谓词里有索引字段,才会用索引。

NO_INDEX Hint
No_index hint 告诉优化器对指定的表不允许使用索引。
示例:

SQL> select /*+no_index(emp index_emp) */ * from emp where id>1;

INDEX_DESC Hint
该 Hint 告诉优化器对指定的索引使用降序方式访问数据,当使用这个方式会导致结果集不完整时,优化器将忽略这个索引。
示例:

SQL> select /*+index_desc(emp index_emp) */ * from emp where id>1;

INDEX_COMBINE Hint
该 Hint 告诉优化器强制选择位图索引,当使用这个方式会导致结果集不完整时,优化器将忽略这个 Hint。
示例:

SQL> select /*+ index_combine(emp index_bm) */ * from emp;

INDEX_FFS Hint
该 hint 告诉优化器以 INDEX_FFS(INDEX Fast Full Scan)的方式访问数据。当使用这个方式会导致结果集不完整时,优化器将忽略这个 Hint。
示例:

SQL> select /*+ index_ffs(emp index_emp) */ id from emp where id>0;

INDEX_JOIN Hint
索引关联,当谓词中引用的列上都有索引时,可以通过索引关联的方式来访问数据。
示例:

SQL> select /*+ index_join(emp index_emp index_bm) */ * from emp where id>0 and name='tom ';

INDEX_SS Hint
该 Hint 强制使用 index skip scan 的方式访问索引,从 Oracle 9i 开始引入这种索引访问方式,当在一个联合索引中,某些谓词条件并不在联合索引的第一列时(或者谓词并不在联合索引的第一列时),可以通过 index
skip scan 来访问索引获得数据。 当联合索引第一列的唯一值很小时,使用这种方式比全表扫描效率要高。当
使用这个方式会导致结果集不完整时,优化器将忽略这个 Hint。
示例:

SQL> select /*+ index_ss(emp index_union) */ * from emp where id>0;
3、表关联顺序的 Hint

LEADING hint
在一个多表关联的查询中,该 Hint 指定由哪个表作为驱动表,告诉优化器首先要访问哪个表上的数据。

示例:

SQL> select /*+leading(t1,t) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;SQL> select /*+leading(t,t1) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 812 | 6 (17)| 00
| 1 | MERGE JOIN | | 14 | 812 | 6 (17)| 00
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| 00
| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00
|* 4 | SORT JOIN | | 14 | 532 | 4 (25)| 00
| 5 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00
--------------------------------------------------------------------------------

ORDERED Hint
该 hint 告诉 Oracle 按照 From 后面的表的顺序来选择驱动表,Oracle 建议在选择驱动表上使用 Leading,它更灵活一些。

SQL> select /*+ordered */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
4、表关联操作的 Hint

USE_HASH,USE_NL,USE_MERGE hint
这三种关联方式是多表关联中主要使用的关联方式。 通常来说,当两个表都比较大时,Hash Join 的效率要高于嵌套循环(nested loops)的关联方式。

Hash join 的工作方式是将一个表(通常是小一点的那个表)做 hash 运算,将列数据存储到 hash 列表中,从另一个表中抽取记录,做 hash 运算,到 hash 列表中找到相应的值,做匹配。

Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops 适用的场合是当一个关联表比较小的时候,效率会更高。

Merge Join 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为 merge join 需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用 merge join 的地方,hash
join 都可以发挥更好的性能。

USE_HASH,USE_NL,USE_MERGE 这三种hint 就是告诉优化器使用哪种关联方式。
示例如下:

SQL> select /*+use_hash(t,t1) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
SQL> select /*+use_nl(t,t1) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
SQL> select /*+use_merge(t,t1) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;

NO_USE_HASH,NO_USE_NL,NO_USE_MERGE HINT
分别禁用对应的关联方式。
示例:

SQL> select /*+no_use_merge(t,t1) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
SQL> select /*+no_use_nl(t,t1) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
SQL> select /*+no_use_hash(t,t1) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
5、并行执行相关的 Hint

PARALLEL HINT
指定 SQL 执行的并行度,这个值会覆盖表自身设定的并行度,如果这个值为 default,CBO 使用系统参数值。
示例:

SQL> select /*+parallel(t 4) */ * from scott.dept t;

NO_PARALLEL HINT
在 SQL 中禁止使用并行。
示例:

SQL> select /*+ no_parallel(t) */ * from scott.dept t;
6、其他方面的一些 Hint

APPEND HINT
提示数据库以直接加载的方式(direct load)将数据加载入库。
示例:

Insert /*+append */ into t as select * from all_objects;

这个 hint 用的比较多。 尤其在插入大量的数据,一般都会用此 hint。

DYNAMIC_SAMPLING HINT
提示 SQL 执行时动态采样的级别。 这个级别从 0-10,它将覆盖系统默认的动态采样级别。
示例:

SQL> select /*+ dynamic_sampling(t 2) */ * from scott.emp t where t.empno>0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QA测试开发工程师面试题满分问答20: 软件的安全性应从哪几个方面去测试?

软件的安全性测试应从多个方面进行,并确保覆盖以下关键方面: 当回答问题时,可以根据自己的经验和知识,从上述要点中选择适合的方面进行详细说明。强调测试的综合性、全面性和持续性,并强调测试的重要性以及如何与开发团…

IDEA最好用插件推荐

1 背景 俗话说:“工欲善其事必先利其器”,本问介绍几款强大实用的 IDEA 插件,助力大家开发。 希望大家做一个聪明又努力的人,而不只是一个努力的人。 以下插件大都可以通过 IDEA 自带的插件管理中心安装,如果搜不到可以…

恶补《操作系统》2_1——王道学习笔记

2操作系统-进程 2.1_1 进程的定义、组成、组织方式、特征 组成:PCB(进程存在唯一的标志),程序段,数据段 组织方式:链接方式,指针指向不同的队列;索引方式,索引表 特征…

Uptime Kuma 使用指南:一款简单易用的站点监控工具

我平时的工作会涉及到监控,而站点是一个很重要的监控项。项目上线后,我们通常会将站点监控配置到云平台上,以检测各站点的连通性。但随着项目不断增多,云平台上的配额就有点捉急了。针对这个情况,我们可以试试这个开源…

设计模式——状态模式19

状态模式是一种行为设计模式, 允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。 设计模式,一定要敲代码理解 状态行为抽象 //在某种状态下&…

【网安小白成长之路】9.sql注入操作

🐮博主syst1m 带你 acquire knowledge! ✨博客首页——syst1m的博客💘 🔞 《网安小白成长之路(我要变成大佬😎!!)》真实小白学习历程,手把手带你一起从入门到入狱🚭 &…

SpringBoot整合七牛云实现图片的上传管理

唠嗑部分 各位小伙伴大家好,我是全栈小白,今天我们来分享一下SpringBoot如何整合七牛云存储实现图片的上传与存储 首先我们来说说图片存储,在项目中图片几乎是必不可少的,那么大家会选择怎样存储呢,当然有几种方案 …

Science Robotics 美国斯坦福大学研制了外行星洞穴探测机器人

月球和火星上的悬崖、洞穴和熔岩管已被确定为具有地质和天体生物学研究理想地点。由于其隔绝特性,这些洞穴提供了相对稳定的条件,可以促进矿物质沉淀和微生物生长。在火星上,这些古老的地下环境与火星表面可能适合居住时几乎没有变化&#xf…

JSP合同信息管理系统

毕业设计(论文) 题 目: JSP合同信息管理系统 学 校: 专 业: 年 级: 姓 名…

Day16-Java进阶-线程通信线程生命周期线程池单例设计模式

1. 线程通信 1.1 线程通信介绍 1.2 两条线程通信 package com.itheima.correspondence;public class CorrespondenceDemo1 {/*两条线程通信*/public static void main(String[] args) {Printer1 p new Printer1();new Thread(new Runnable() {Overridepublic void run() {syn…

【亲测有用】idea2024.1中前进后退按钮图标添加

idea更新后,前进后退按钮消失了,现在说下怎么设置 具体操作如下: 1、选择 File / Settings(windows版),或者Preferences(mac版) 2、打开 Appearance & Behavior 并选择 Menus and Toolbars 3、选择右侧的 “Main toolbar lef…

Python中pyside2出现的pyside2 qt platform plugin could be in错误及其解决方法

系统平台:Win10 64bit python版本: python 3.8 使用pip install pyside2安装 pyside2 这是找不到QT平台的插件,这是环境变量QT_QPA_PLATFORM_PLUGIN_PATH出现错误 具体解决方法: 我们可以在每一段程序开始之前设定环境变量&…

虚幻引擎5 Gameplay框架(一)

GamePlay概论与打包和批处理脚本 GamePlay简介与创建项目 GamePlay框架:用于设计游戏规则,组织和管理游戏核心逻辑、规则以及交互的一套结构化体系。 Default Pawn Class:定义角色行为逻辑,接收玩家控制器的输入,一般…

【R语言】组合图:散点图+箱线图+平滑曲线图+柱状图

用算数运算符轻松组合不同的ggplot图,如图: 具体代码如下: install.packages("devtools")#安装devtools包 devtools::install_github("thomasp85/patchwork")#安装patchwork包 library(ggplot2) library(patchwork) #p1是…

[ACTF2020 新生赛]Upload--BUUCTF

题: 第一步:上传php文件,他提示,只能上传jpg、png、gif 第二步:使用bp抓上传jpg文件的包,在修改文件后缀名为phtml 修改前 修改后 第三步:进行放过,在访问浏览器 得到:U…

第07-4章 网络层详解

7.1 网络层协议 IP协议ARP(地址解析协议)RARP(反向地址解析协议)ICMP(互联网控制消息协议) 7.2 IP协议详解 7.2.1 IP协议功能 寻址和路由传递服务(不可靠,尽最大努力&#xff0c…

线性代数基础1向量

1、向量是什么 1.1、向量的定义 在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有大小和方向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的…

Rust腐蚀服务器定制地图开服

Rust腐蚀服务器定制地图开服 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀这个游戏有很多的插件mod作者,在地图制作这一块也是一样,有些好玩的地图可能大家在map网站找到了但是不知道怎么操作设置那么今天艾西给大家说下特定定制地图怎么弄。…

嬴图| ISO/IEC-GQL国际图语言标准发布,图技术开启新纪元

GQL作为继SQL之后的第二个数据库查询语言国际标准,近日正式发布。这标志着图技术开启新纪元——图时代即将到来! 同时,这也预示着将有越来越多的组织采用“图”来解决各种复杂问题,更意味着SQL系统与负载将逐渐转向GQL&#xff0…

2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版 最新SSL证书在线申请系统源码 | 支持API接口 SSL证书保证网络安全的基本保障。向您介绍我们的在线生成SSL…