当前位置: 首页 > article >正文

Oracle的Hint

racle的Hint是用来提示Oracle的优化器,用来选择用户期望的执行计划。在许多情况下,Oracle默认的执行方式并不总是最优的,只不过由于平时操作的数据量比较小,所以,好的执行计划与差的执行计划所消耗的时间差异不大,用户感觉不到而已。但对于书写操作大数据量的SQL而言,其SQL的书写则需要先了解一下执行计划是否最优或满足生产需要。通常当从开发环境迁移到生产环境下时,往往会出现此类情况。

例如:假设有一张客户表,在客户类别上有索引。如果想查找某一类别用户,而该类别用户占总数的比例高达90%,那么此时采用全表扫描方式将会比索引扫描方式快。如果不使用Hint,那么Oracle很可能会选择使用索引方式来执行。

使用Hint可以实现以下功能:

(1)改变SQL中的表的关联顺序。

(2)改变SQL中的表的关联方式。

(3)实现并行方式执行DML、DDL以及SELECT语句。

(4)改变表的访问路径(数据读取方式)。

(5)调整查询转换类型,重写SQL。

(6)调整优化器优化目标。

(7)调整优化器类型。

Oracle推出了一个隐含参数“_OPTIMIZER_IGNORE_HINTS”,取值为TRUE或FALSE,缺省值是FALSE。Oracle可以通过将该隐含参数设置为TRUE,使得Oracle优化器忽略语句中所有的Hint。显然,Oracle提供此参数的目的就是在不修改应用的前提下,忽略所有Hint,让Oracle优化器自己来选择执行路径。

Hint的语法格式如下所示:

代码语言:javascript代码运行次数:0
运行
AI代码解释
{SELECT | INSERT | UPDATE | DELETE | MERGE} /+ <具体的Hint内容>

关于Hint需要注意以下几点:

l Hint中第一个星号(*)和加号(+)之间不能有空格。

l Hint中加号(+)和具体的Hint内容之间可以有空格,也可以没有空格,但通常为了规范和区别于注释建议加上空格。

l Hint中的具体内容可以是单个Hint,也可以是多个Hint的组合,如果是后者,那么各个Hint间至少需要用1个空格来彼此分隔。

l Hint必须紧随关键字SELECT、INSERT、UPDATE、DELETE或MERGE之后。

l 如果在目标SQL中使用了Hint,那么就意味着自动启用了CBO,即Oracle会以CBO来解析含Hint的目标SQL。但是对于RULE和DRIVING_SITE来说,它们可以在RBO下使用,而且不自动启用CBO。

l Hint中指定具体对象时(比如指定表名或索引名),不能带上该对象所在SCHEMA的名称,即使该SQL文本中己经有对应的SCHEMA名称。

l Hint中指定具体表名时,如果该表在对应SQL文本中有别名,那么在Hint中应该使用该表的别名。

l 对于简单的SQL语句一般只有一个查询块(Query Block),那么在其上设置Hint其作用范围就是该语句块,而对于复杂的有多个查询语句的SQL语句(例如查询中用到了子查询、内联视图、集合等操作时),各个Hint的作用域是不同的。Hint生效的范围仅限于它本身所在的查询块,如果在Hint中不指定该Hint生效的查询块,那么Oracle会默认认为它生效的范围是指该Hint所处于的查询块。

l 由于各种原因导致Hint被Oracle忽略后,Oracle并不会给出任何提示或者警告,更不会报错,目标SQL依然可以正常执行。导致Hint失效的原因通常有:

① 使用的Hint有语法或者拼写错误。

② 使用的Hint是无效的(例如,在非等值连接中使用了USE_HASH)。

③ 使用的Hint是自相矛盾的(例如,即指定了FULL又指定了INDEX_FFS),但Oracle只是将自相矛盾的Hint全部忽略掉,而组合Hint中的其它Hint依然有效。

④ 使用的Hint受到了查询转换的干扰。

⑤ 依据Hint执行的结果是错误的(例如在非空的索引列上计算行数)。

⑥ 使用的Hint受到了保留关键字的干扰。Oracle在解析Hint的时候,从左到右进行,如果遇到一个词是Oracle关键字或保留字,那么Oracle将忽略这个词以及之后的所有词。如果遇到的一个词既不是关键字也不是Hint,那么就忽略该词。如果遇到的词是有效的Hint,那么就会保留该Hint。Oracle的保留字或者关键字可以通过视图V$RESERVED_WORDS来查询。由此可以知道下面5条SQL语句中只有1和4中的APPEND提示是起作用的。

代码语言:javascript代码运行次数:0
运行
AI代码解释

  1. INSERT /*+ APPEND,PARALLEL(T1) */ INTO T1 SELECT * FROM T2;
  2. INSERT /*+ PARALLEL(T1), APPEND */ INTO T1 SELECT * FROM T2;
  3. INSERT /*+ THIS IS APPEND */ INTO T1 SELECT * FROM T2;
  4. INSERT /*+ THIS APPEND */ INTO T1 SELECT * FROM T2;
  5. INSERT /*+ NOLOGGING APPEND / INTO T1 SELECT * FROM T2;
    因为“IS”是一个关键字,“,”(逗号)也是一个关键字,所以,上面的第2和第3条SQL,Oracle解析时,当遇到“,”和“IS”时,就忽略了后面的所有Hint。在第4条SQL中,THIS并不是一个关键字,所以,APPEND提示有效。为了避免这样的情况发生,当在SQL中书写Hint时,在/
    + */这种结构内只写Hint,而不要写逗号,或者是其它的注释。如果要对SQL写注释,那么可以在专门的注释结构中书写。

在SQL语句优化过程中,经常会用到Hint,通过在SQL语句中设置Hint从而影响SQL的执行计划,通过V$SQL_HINT视图可以查询所有的Hint,下表是一些常用的Hint:

表 3-19 常用Hint介绍

建议对上表中每个Hint都做相关的实验来深入学习,而本书不再详述。最后需要说明一下有关NOLOGGING的错误使用情况。下面几条SQL都是使用NOLOGGING时的错误用法:

代码语言:javascript代码运行次数:0
运行
AI代码解释
INSERT INTO T1 NOLOGGING;
INSERT INTO T1 SELECT * FROM T2 NOLOGGING;
INSERT /*+ NOLOGGING / INTO T1 VALUES (‘0’);
INSERT /
+ NOLOGGING / INTO T1 SELECT * FROM T2;
DELETE /
+ NOLOGGING / FROM T1;
UPDATE /
+ NOLOGGING */ T1 SET A=‘1’;
实际上,上述所有的SQL没有一个能够实现“不产生”日志的数据更改操作。事实上,NOLOGGING并不是Oracle的一个有效的Hint,而是一个SQL关键字,通常用于DDL语句中。这里NOLOGGING相当于给SELECT的表指定了一个别名为“NOLOGGING”。下面是NOLOGGING的一些正确用法:

代码语言:javascript代码运行次数:0
运行
AI代码解释
CREATE TABLE T1 NOLOGGING AS SELECT * FROM T2;
CREATE INDEX T1_IDX ON T1(A) NOLOGGING;
ALTER INDEX T1_IDX REDUILD ONLINE NOLOGGING;
ALTER TABLE T1 NOLOGGING;
若面试官问如何强制一个SQL语句使用索引,此时就可以回答使用Hint,/+INDEX(TABLE INDEX_NAME)/来完成。

& 说明:

有关Hint的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2125011/、http://blog.itpub.net/26736162/viewspace-2125709/

相关文章:

Oracle的Hint

racle的Hint是用来提示Oracle的优化器&#xff0c;用来选择用户期望的执行计划。在许多情况下&#xff0c;Oracle默认的执行方式并不总是最优的&#xff0c;只不过由于平时操作的数据量比较小&#xff0c;所以&#xff0c;好的执行计划与差的执行计划所消耗的时间差异不大&…...

手动事务的使用

使用原因&#xff1a; 公司需要写一个定时任务&#xff0c;涉及增改查操作&#xff0c; 定时将前端页面配置的字典数据&#xff08;标签数据&#xff09;同步到数据库特定的表(标签表) 查询字典表数据 字典有,数据库表没有新增 都有&#xff0c;判断名称&#xff0c;名称不同修…...

Vue 树状结构控件

1、效果图如下所示&#xff1a; 2、网络请求的数据结构如下&#xff1a; 3、新建插件文件&#xff1a;menu-tree.vue&#xff0c;插件代码如下&#xff1a; <template><div class"root"><div class"parent" click"onParentClick(pare…...

Spring Boot的启动流程,以及各个扩展点的执行顺序

目录 1. 初始化阶段执行顺序 1.1 Bean的构造方法&#xff08;构造函数&#xff09; 1.2 PostConstruct 注解方法 1.3 InitializingBean 的 afterPropertiesSet() 1.4 Bean(initMethod "自定义方法") 2. 上下文就绪后的扩展点 2.1 ApplicationContext 事件监听…...

【LUT技术专题】图像自适应3DLUT代码讲解

本文是对图像自适应3DLUT技术的代码解读&#xff0c;原文解读请看图像自适应3DLUT文章讲解 1、原文概要 结合3D LUT和CNN&#xff0c;使用成对和非成对的数据集进行训练&#xff0c;训练后能够完成自动的图像增强&#xff0c;同时还可以做到极低的资源消耗。下图为整个模型的…...

Apache Doris 在数据仓库中的作用与应用实践

在当今数字化时代&#xff0c;企业数据呈爆炸式增长&#xff0c;数据仓库作为企业数据管理和分析的核心基础设施&#xff0c;其重要性不言而喻。而 Apache Doris&#xff0c;作为一款基于 MPP&#xff08;Massively Parallel Processing&#xff0c;大规模并行处理&#xff09;…...

vscode使用“EIDE”和“Cortex-Debug”插件利用st-link插件实现程序烧写以及调试工作

第一步&#xff1a;安装vscode插件“EIDE”EIDE和“Cortex-Debug”。 第二步&#xff1a;配置EIDE 2.1安装“实用工具”&#xff1a; 2.2 EIDE插件配置&#xff1a;根据安装的keil C51 keil MDK IAR的相关路径设置 第三步&#xff1a;配置Cortex-Debug插件 点击settings.jso…...

Spring @Value注解的依赖注入实现原理

Spring Value注解的依赖注入实现原理 一&#xff0c;什么是Value注解的依赖注入二&#xff0c;实现原理三&#xff0c;代码实现1. 定义 Value 注解2. 实现 InstantiationAwareBeanPostProcessor3. 实现 AutowiredAnnotationBeanPostProcessor4. 占位符解析逻辑5. 定义 StringVa…...

三、kafka消费的全流程

五、多线程安全问题 1、多线程安全的定义 使用多线程访问一个资源&#xff0c;这个资源始终都能表现出正确的行为。 不被运行的环境影响、多线程可以交替访问、不需要任何额外的同步和协同。 2、Java实现多线程安全生产者 这里只是模拟多线程环境下使用生产者发送消息&…...

商品模块中的多规格设计:实现方式与电商/ERP系统的架构对比

在商品管理系统中&#xff0c;多规格设计&#xff08;Multi-Specification Product Design&#xff09;是一个至关重要但又极具挑战性的领域。无论是面向消费者的电商系统&#xff0c;还是面向企业管理的ERP系统&#xff0c;对商品规格的处理方式直接影响库存管理、订单履约、数…...

(三)动手学线性神经网络:从数学原理到代码实现

1 线性回归 线性回归是一种基本的预测模型&#xff0c;用于根据输入特征预测连续的输出值。它是机器学习和深度学习中最简单的模型之一&#xff0c;但却是理解更复杂模型的基础。 1.1 线性回归的基本元素 概念理解&#xff1a; 线性回归假设输入特征和输出之间存在线性关系。…...

Axure形状类组件图标库(共8套)

点击下载《月下倚楼图标库(形状组件)》 原型效果&#xff1a;https://axhub.im/ax9/02043f78e1b4386f/#g1 摘要 本图标库集锦精心汇集了8套专为Axure设计的形状类图标资源&#xff0c;旨在为产品经理、UI/UX设计师以及开发人员提供丰富多样的设计素材&#xff0c;提升原型设计…...

20250530-C#知识:String与StringBuilder

String与StringBuilder string字符串在开发中经常被用到&#xff0c;不过在需要频繁对字符串进行增加和删除时&#xff0c;使用StringBuilder有利于提升效率。 1、String string是一种引用类型而非值类型&#xff08;某些方面像值类型&#xff09;使用“”进行两个string对象的…...

从 Docker 到 Containerd:Kubernetes 容器运行时迁移实战指南

一、背景 Kubernetes 自 v1.24 起移除了 dockershim&#xff0c;不再原生支持 Docker Engine&#xff0c;用户需迁移至受支持的 CRI 兼容运行时&#xff0c;如&#xff1a; Containerd&#xff08;推荐&#xff0c;高性能、轻量级&#xff09; CRI-O&#xff08;专为 Kuberne…...

uniapp中view标签使用范围

不止用于微信小程序。兼容型号&#xff0c;是uniapp内置组件之一&#xff0c;在uniapp中进行了跨平台适配。支持所有uniapp的平台。如微信小程序、h5、app、支付宝小程序...

Celery 核心概念详解及示例

Celery 核心概念详解及示例 Celery 是一个简单、灵活且可靠的分布式系统&#xff0c;用于处理大量消息&#xff0c;提供对任务队列的操作&#xff0c;并支持任务的调度和异步执行。它常用于深度优化 Web 应用的性能和响应速度&#xff0c;通过将耗时的操作移到后台异步执行&am…...

欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!

&#x1f680; 用 STM32 或 EFR32 实现 BLE 通信模块&#xff1a;从0到蓝牙&#xff0c;你也能搞&#xff01; “我能不能自己用 STM32 或 EFR32 实现一个 BLE 模块&#xff1f;” 答案当然是&#xff1a;能&#xff01;还能很帅&#xff01; &#x1f468;‍&#x1f3ed; 前…...

IDEA 在公司内网配置gitlab

赋值项目链接 HTTPS 将HTTP的链接 ip地址换成 内网地址 例如&#xff1a;https:172.16.100.18/...... 如果出现需要需要Token验证的情况&#xff1a; 参考&#xff1a;Idea2024中拉取代码时GitLab提示输入token的问题_gitlab token-CSDN博客...

黑马Java面试笔记之 微服务篇(业务)

一. 限流 你们项目中有没有做过限流?怎么做的? 为什么要限流呢? 一是并发的确大(突发流量) 二是防止用户恶意刷接口 限流的实现方式: Tomcat:可以设置最大连接数 可以通过maxThreads设置最大Tomcat连接数,实现限流,但是适用于单体架构 Nginx:漏桶算法网关,令牌桶算法自定…...

通过WiFi无线连接小米手机摄像头到电脑的方法

通过WiFi无线连接小米手机摄像头到电脑的方法 以下是基于Scrcpy和DroidCam两种工具的无线连接方案&#xff0c;需提前完成开发者模式与USB调试的开启&#xff08;参考原教程步骤&#xff09;&#xff1a; 方法一&#xff1a;Scrcpy无线投屏&#xff08;无需手机端安装&#xf…...

长短期记忆(LSTM)网络模型

一、概述 长短期记忆&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;网络是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专门设计用于解决传统 RNN 在处理长序列数据时面临的梯度消失 / 爆炸问题&#xff0c;能够有效捕捉长距离依赖关系。…...

深入理解 Linux 文件系统与日志文件分析

一、Linux 文件系统概述 1. 文件系统的基本概念 文件系统&#xff08;File System&#xff09;是操作系统用于管理和组织存储设备上数据的机制。它提供了一种结构&#xff0c;使得用户和应用程序能够方便地存储和访问数据。 2. Linux 文件系统结构 Linux 文件系统采用树状目…...

CSS3美化页面元素

1. 字体 <span>标签 字体样式⭐ 字体类型&#xff08;font-family&#xff09; 字体大小&#xff08;font-size&#xff09; 字体风格&#xff08;font-style&#xff09; 字体粗细&#xff08;font-weight&#xff09; 字体属性&#xff08;font&#xff09; 2. 文本 文…...

网络安全-等级保护(等保)3-0 等级保护测评要求现行技术标准

################################################################################ 第三章&#xff1a;测评要求、测评机构要求&#xff0c;最终目的是通过测评&#xff0c;所以我们将等保要求和测评相关要求一一对应形成表格。 GB/T 28448-2019 《信息安全技术 网络安全等…...

WPS 利用 宏 脚本拆分 Excel 多行文本到多行

文章目录 WPS 利用 宏 脚本拆分 Excel 多行文本到多行效果需求背景&#x1f6e0; 操作步骤代码实现代码详解使用场景注意事项总结 WPS 利用 宏 脚本拆分 Excel 多行文本到多行 在 Excel 工作表中&#xff0c;我们经常遇到一列中包含多行文本&#xff08;用换行符分隔&#xff…...

R语言错误处理方法大全

在R语言的批量运行中&#xff0c;常需要自动跳过错误&#xff0c;继续向下运行。 1、使用 tryCatch() 捕获错误并返回占位符 # 示例&#xff1a;循环中跳过错误继续执行 results <- numeric(5) # 预分配结果向量for(i in 1:5) {# 用 tryCatch 包裹可能出错的代码results[…...

AI“实体化”革命:具身智能如何重构体育、工业与未来生活

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正在重塑各行各业&#xff0c;而具身智能&#xff08;Embodied AI&#xff09;作为AI领域的重要分支&#xff0c;正逐渐从实验室走向现实应用。具身智能的核心在于让AI系统具备物理实体&#xff0c;能够与环…...

Opencv4 c++ 自用笔记 05 形态学操作

图像形态学主要获取物体的形状与位置信息。利用具有一定形态的结构元素度量和提取图像中的对应形状&#xff0c;达到对图像分析和识别的目的。操作主要包括腐蚀、膨胀、开运算和闭运算。 像素距离与连通域 图像形态学中&#xff0c;将不与其他区域链接的独立区域称为集合或者…...

DrissionPage 数据提取技巧全解析:从入门到实战

在当今数据驱动的时代&#xff0c;网页数据提取已成为自动化办公、市场分析和爬虫开发的核心技能。作为新一代网页自动化工具&#xff0c;DrissionPage 以其独特的双模式融合设计&#xff08;Selenium Requests&#xff09;脱颖而出。本文将结合官方文档与实战案例&#xff0c…...

如何构建自适应架构的镜像

目标 我有一个服务叫xxx&#xff0c;一开始它运行在x86架构的机器上&#xff0c;所以最开始有个xxx:stable-amd64的镜像&#xff0c;后来它又需要运行在arm64架构的机器上&#xff0c;所以又重新打了个xxx:stable-arm64的镜像 但是对于安装脚本来说&#xff0c;我不希望我在拉…...