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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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出现错误 具体解决方法: 我们可以在每一段程序开始之前设定环境变量&…

pytorch与深度学习

ChatGPT PyTorch是一个由Facebook AI Research Team开发的开源深度学习库,它提供了一个灵活的环境和丰富的API,用于快速且方便地构建、训练和部署深度学习模型。PyTorch在科学界和工业界都收到了广泛的使用,其中包括了学术研究、小型项目和大…

第50篇:算法的硬件实现<一>

Q:本期我们来开始介绍如何使用算法状态机(ASM)图在硬件开发板上实现算法。 A:算法状态机 (Algorithmic State Machine,ASM) 图是描述数字系统控制单元的工作流程图,主要用来描述控制单元的时序操作特性&am…

功能测试用例设计思路

我们为什么要写好一份测试用例呢?测试同学应该都知道测试用例的重要性,测试用例就是我们测试的依据,也是测试过程中不能缺少的测试文档。 一、用例编写规范目的: 1、提高测试用例的可读性,可执行性、合理性。 2、测试…

Spring(下)

接上篇,从第八个问题讲起 八.Spring工厂创建复杂对象 1.什么是复杂对象 简单对象就是可以直接new出来的,也就是直接调用构造方法创建 所以复杂对象就是不能直接通过调用构造方法创建。就比如JDBC中的Connection 2.三种方法 (1&#xff…

4月阿里offer被毁,我该怎么进字节?

在校招求职的浪潮中,有些故事总是让人唏嘘不已。比如最近在社交平台上广泛讨论的一个话题:“4月阿里offer被毁,我该怎么进字节?”这不仅反映了当下职场的变动性,也映射了求职者在面对突如其来的变故时的无助与挣扎。 …

基于springboot实现精准扶贫管理系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现精准扶贫管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了精准扶贫管理系统的开发全过程。通过分析精准扶贫管理系统管理的不足,创建了一个计算机管理精准扶贫管理系…

docker-003镜像制作

步骤 使用docker commit提交容器使之成为镜像以ubuntu安装vim后的容器为例 1 ubuntu安装vim 启动容器 docker run -it --nameubuntu-vim ubuntu /bin/bash安装vim apt-get update apt-get install vim2 提交容器作为镜像 查看容器 docker ps -a提交容器作为镜像 命令格式&…

随机森林计算指标重要性—从决策树到随机森林Python实现

文章目录 前言一、节点二、决策树2.1 案例分析——优良的水稻2.2 案例分析——家庭财富水平 三、随机森林三、Python代码实现3.1 关键问题3.1.1 节点的表示3.1.2 决策树的表示** 根节点划分左右子树的依据 **3.1.3 随机森林的构造与重要性的表示 3.2 节点类3.2 决策树类3.2.1 初…

阿里云OSS对象存储的使用和快速入门

一、介绍 云存储是一种通过互联网连接的服务,允许用户将数据存储在远程的云服务器上,而不是存储在本地设备上。这些数据可以包括文件、数据库、备份等各种类型的信息。云存储服务提供商通常会管理和维护这些存储设施,并提供用户可以访问、管…

c语言中的数组

数组 数组是一种构造类型,是由基本类型构造而成。当我们想用一群变量来描述同一类相同的东西时候,比如100个年龄变量,我们可以这样int age1;int age2;int age3;……int age 100;这样即不方便书写&#xff…

【公司UI自动化学习】

公司课程链接:https://l.jd.com/student/project/project.du?project_id697509403 公司的课程,是给一个学习方向。 一、 PC自动化 1)什么项目适合 2)PC自动化介入时间点 3)自动化率: 频繁改动的&…

自动化测试Selenium(3)

目录 WebDriver相关API 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器的宽,高 操作浏览器的前进, 后退, 刷新 控制浏览器滚动条 键盘事件 键盘单键用法 键盘组合按键用法 鼠标事件 WebDriver相关API 打印信息 打印title 即打印该网址的标题.…

SAP 销售业务中免费货物的会计核算

此博文主要介绍SAP销售业务中免费货物解决方案中,免费货物的会计核算。如果需要进一步了解SAP SD 销售与分销业务中,免费货物的标准解决方案概览,可先了解本博客博文:SAP销售与分销中的免费货物解决方案相关文章: htt…

负采样重要吗?它的理论与应用综述

Does Negative Sampling Matter? A Review with Insights into its Theory and Applications 负采样重要吗?它的理论与应用综述 Does Negative Sampling Matter? A Review with Insights into its Theory and Applications Zhen Yang, Ming Ding, Tinglin Huang,…

一文掌握运维绩效考核指标及实例参考

运维绩效考核需要综合考虑公司的战略和目标,确保考核公正和合理,同时还需要建立合适的管理和收集系统,根据绩效结果进行反馈和奖惩,并落实改进措施。 运维团队合理的绩效考核非常重要,以激励团队成员不断提高,同时确保团队目标的实现。针对运维团队的绩效评估,我们通常…

十一、Yocto集成tcpdump等网络工具

文章目录 Yocto集成tcpdump等网络工具networking layer集成 Yocto集成tcpdump等网络工具 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十一篇文章: 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi 4B) 三、Yocto创建自定义的lay…

JVM(java虚拟机 详解三个主要的话题:1.JVM 中的内存区域划分2.JVM 的类加载机制3.JVM 中的垃圾回收算法)

jdk java开发工具包 jre java运行时环境 jvm java虚拟机 JDK、JRE、JVM之间的关系? JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。…

【Java】实现一个简单的线程池

📝个人主页:哈__ 期待您的关注 一、线程池的模式 线程池顾名思义就是管理线程的一个池子,我们把创建线程的过程交给线程池来处理,而这个线程池当中的线程都会从阻塞队列当中取获取任务执行。 我们不在直接把任务的创建过程写到…

【信号与系统 - 10】拉普拉斯变换

1 定义 周期信号的傅里叶变换那篇提到了&#xff1a; F ( j w ) ∫ − ∞ ∞ e − j w t f ( t ) d t F(jw)\int^{\infty}_{-\infty}e^{-jwt}f(t)dt F(jw)∫−∞∞​e−jwtf(t)dt 这个定义式需要满足绝对可积&#xff0c;即 ∫ − ∞ ∞ ∣ f ( t ) ∣ d t < ∞ \int…