Oracle Hint:USE_NL、USE_MERGE、USE_HASH

Oracle查询优化神器:Hint命令使用大全 Oracle Hint是一种嵌入在SQL注释中的特殊指令,用于指导优化器选择执行计划。主要分为访问路径Hint(FULL、INDEX等)、连接顺序Hint(ORDERED、LEADING)、连接方法HintUSE_NLUSE_HASH等)、并行执行Hint(PARALLEL)和高级Hint(MATERIALIZE、FIRST_ROWS等)。使用时需遵循特定语法格式,可通过执行计划对比验证效果。需注意Hint可能因语法错误、别名不匹配等原因失效,建议先分析后逐步添加,并定期复查。合理使用Hint优化查询 阅读详情

一、USE_NL(嵌套循环连接)

   在嵌套循环连接中,Oracle从第一个行源中读取第一行,然后和第二个行源中的数据进行对比。所有匹配的记录放在结果集中,然后Oracle将读取第一个行源中的下一行。按这种方式直至第一个数据源中的所在行都经过处理。第一个记录源通常称为外部表,或者驱动表,相应的第二个行源称为内部表。使用嵌套循环连接是一种从连接结果中提取第一批记录的最快速的方法。

 

    在驱动行源表(就是您正在查找的记录)较小、或者内部行源表已连接的列有惟一的索引或高度可选的非惟一索引时,嵌套循环连接效果是比较理想的。嵌套循环连接比其他连接方法有优势,它可以快速地从结果集中提取第一批记录,而不用等待整个结果集完全确定下来。这样,在理想情况下,终端用户就可以通过查询屏幕查看第一批记录,而在同时读取其他记录。不管如何定义连接的条件或者模式,任何两行记录源可以使用嵌套循环连接,所以嵌套循环连接是非常灵活的。

 

    然而,如果内部行源表(读取的第二张表)已连接的列上不包含索引,或者索引不是高度可选时, 嵌套循环连接效率是很低的。如果驱动行源表(从驱动表中提取的记录)非常庞大时,其他的连接方法可能更加有效。

 

二、USE_MERGE(排列合并连接)

   在排列合并连接中,Oracle分别将第一个源表、第二个源表按它们各自要连接的列排序,然后将两个已经排序的源表合并。如果找到匹配的数据,就放到结果集中。

 

    在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(超过记录数的5%),排序合并连接将比嵌套循环连更加高效。但是,排列合并连接只能用于等价连接(WHERE D.deptno=E.dejptno,而不是WHERE D.deptno>=E.deptno)。排列合并连接需要临时的内存块,以用于排序(如果SORT_AREA_SIZE设置得太小的话)。这将导致在临时表空间占用更多的内存和磁盘I/O

 

三、USE_HASH(哈希连接)

   当内存能够提供足够的空间时,哈希(HASH)连接是Oracle优化器通常的选择。在哈希连接中,Oracle访问一张表(通常是较大的表),并在内存中建立一张基于连接键的哈希表。然后它扫描连接中其他的表(通常是较大的表),并根据哈希表检测是否有匹配的记录。

 

只有在数据库初始化参数HASH_JOIN_ENABLED设为True,并且为参数PGA_AGGREGATE_TARGET设置了一个足够大的值的时候,Oracle才会使用哈希边连接(HASH_AREA_SIZE是向下兼容的参数,但在Oracle9i之前的版本中应当使用HASH_AREA_SIZE)。这和嵌套循环连接有点类似——Oracle先建立一张哈希表以利于操作进行。当使用ORDERED提示时,FROM子句中的第一张表将用于建立哈希表。

 

    当缺少有用的索引时,哈希连接比嵌套循环连接更加有效。哈希连接可能比排序合并连接更快,因为在这种情况下只有一张源表需要排序。哈希连接也可能比嵌套循环连接更快,因为处理内存中的哈希表比检索B_树索引更加迅速。和排序合并连接、群集连接一样,哈希连接只能用于等价连接。和排序合并连接一样,哈希连接使用内存资源,并且当用于排序内存不足时,会增加临时表空间的I/O(这将使这种连接方法速度变得极慢)。最后,只有基于代价的优化器才可以使用哈希连接。

 

AI 与新媒体 AI重构新媒体生态:从生产到分发的全链路变革 AI正成为新媒体领域的核心基础设施,通过五大能力重塑内容产业:自动化生产(AIGC写作/制图/剪辑效率提升5-10倍)、智能分发(算法精准匹配用户)、数据洞察(实时舆情分析)、风险管控(审核效率提升12倍)和运营优化(A/B测试自动化)。这推动行业从"人找内容"转向"内容找人",制作成本下降90%的同时,也带来同质化加剧、版权争议和职业重构等挑战。当前阶段,人机协同成为主流——AI处理标准化生产,人类专注创意与价值观把控。 阅读详情

相关推荐

通讯软件019——分分钟学会Prosys OPC UA Server配置

本文介绍如何配置Prosys OPC UA Simulation Server,通过本文可以对OPC UA的基本概念有所了解,掌握OPC UA的本质。

zhouwl72的博客 4195

oraclehint函数

介绍了oracle中的hint,常用的 ordered、use_nluse_hash、index、full 五种, 给出使用实例和适用场景

Oracle知识总结(一)| Oracle表连接优化思路

Oracle表嵌套查询、哈希连接、排序合并连接、笛卡尔连接、标量子查询、半连接、反半连接、FILTER、IN与EXISTS优化思路

xiaobinhxb的博客 4051

oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园

ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表use_nl(t1,t2):表示对表t1、t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁是被驱动的表USE_NL(),先看看oracle doc怎么说:In this statement, the USE_NL hint explicitly chooses a nested loops ...

weixin_39806388的博客 1925

Oracle 提示(hint)方法:use_nl

是一个提示(hint),用于指示查询优化器使用"NESTED LOOPS"连接方式。该提示告诉查询优化器在执行连接操作时,应该优先考虑使用"NESTED LOOPS"连接方式,而不是其他连接方式(如"HASH JOIN"或"MERGE JOIN)。通常情况下,Oracle 查询优化器会根据表的大小、索引情况、统计信息等因素自动选择最佳的连接方式。但是,在某些情况下,开发人员可能希望强制使用特定的连接方式,以达到更好的性能。

xharvard的专栏 1885

oracle usehash用法,Oracle Use_hash(SmalltableA,BigTtable) Table Optmizise | 学步园

/*+ USE_HASH(TABLE) */ use_hash提示对指定的标志性一个散列连接。将指定的表与其他行源通过哈希连接方式连接起来.从本质上讲,散列连接是Oracle用以驱动表(最小的表,where 子句中的第一个表)向RAM区中装载纪录的方法,RAM区是由hash_area_size初始化参数定义的。然后,Oracle使用散列的方法定位第二小的表中的纪录。在两个表都非常大的情况下,散列连...

weixin_39605455的博客 3188

Oracle HintUSE_NLUSE_MERGE、UESE_HASH

下面内容取自http://yangtingkun.itpub.net/post/468/26696 一、USE_NL(嵌套循环连接) 在嵌套循环连接中,Oracle从第一个行源中读取第一行,然后和第二个行源中的数据进行对比。所有匹配的记录放在结果集中,然后Oracle将读取第一个行源中的下一行。按这种方式直至第一个数据源中的所在行都经过处理。第一个记录源通常称为外部表,或...

abc123098098的博客 391

Oracle Hint (1) :UESE_HASH, USE_MERGE, USE_NL

1. USE_HASH (哈希连接)The USE_HASH hint instructs the optimizer to join each specified table with anotherrow...

cqx14379的博客 1780

oracle三种表join方式

使用use_merge hint强制走 sort merge join 19:36:08 SYS::CDB$ROOT::cdb1::3785>select /*+ use_merge(ta t_owner) */ * from ta,t_owner where ta.owner=t_owner.owner; SP2-0612: Error generating AUTOTRACE repor...

wgz7747147820的博客 1635

优化器的方向盘:深度解析Oracle Hint使用技巧、风险与最佳实践

Hint的本质定义Hint是嵌入在SQL语句中的特殊注释,用于指导CBO优化器按照DBA或开发人员的意愿选择特定的执行计划。Hint以/*+ */格式出现在SELECT、INSERT、UPDATE、DELETE关键字之后。SELECT /*+ Hint名称(参数) */列名FROM 表名WHERE 条件;-- 多个Hint可以用空格分隔t1.*, t2.*【Hint是导航仪的强制路线设置】“走小路,别走高速”(强制索引扫描,避免全表扫描)。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 580

常见Oracle HINT的用法

在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+F...

T-B的博客 2万+

Oracle函数之use_hash

目录 一、函数介绍 二、比较 一、函数介绍 select /*+ use_hash(ici,ifc) */ ici.user_code, ifc.file_name from issue_ipo_cust_info ici left join issue_ipo_file_content ifc on ifc.id = ici.file_id; use_hash可以加...

伟哥 6517

oracle hint use_nl,了解如何利用ordered,use_nl(),leading(),index()进行调优 ...

首先我们来分别介绍一下这四个hint的概念:1. ORDERED hint:ordered hint 指示oracle按照from关键字后的表顺序来进行连接。如果没有及时收集统计信息,查询优化器没有得到足够信息,此时你可以自行选择适当的inner及outer表进行连接。ORACLE推荐使用LEADING hint,它比ordered hint有更多的用途。2. LEADING hint:leadi...

weixin_35828255的博客 1688

USE_NL

use_nl (table1,table2....) 提示指示指定表作为inner table,如果指定的表已经作为了outer table(驱动表),那么优化器会忽略use_nl 提示,如果非要强制它作为inner table ,可以与ordered 提示一起使用。下面以SCOTT测试用户作为试验 SQL> select table_name,last_analyzed from

落落的专栏 专注SQL调优 性能调优 7666

oracle中+use_hash(t,p)这样的加速算是什么样的方式?

我在开发的时候经常会用到这样的方式,还有parallel这样的关键字做查询,速度真的加速不少。但是一直找不到/*+*/这样的orale方式是什么,是什么样的方式。咱们常用的关键字有哪些?RULE (基于规则) COST (基于成本) CHOOSE (选择性)不加的话,oracle自动分析SQL,尽量采取它认为最优的方式查询~这样写就是显式的告诉oracle数据库 你要采取什么方式来查询~它在处理你的SQL时,就按照你的要求去查询~请大家帮忙解释一下。

锦上添花 735

USE_HASH

use_hash(table1,table2) 指定table1,table2连接以HASH 方式连接,采用这种方式,我们不能控制table1,table2哪个表为驱动表, 优化器会根据cost自动选择驱动表,如果我们非要控制table1为驱动表,可以加上leading(table1)作为提示,或者用ordered 作为提示。 另外如果我们使用use_hash(table1)有可能优化器不会选

heqiyu34的专栏 2159

多表使用use_hash hint

我们在写多表use_hash(use_nl也一样)hint的时候,use_hash的括号里面是可以放多个表(顺序无关),但是一定要结合leading 的hint,才能保证优化器不使用其他的join方式。-------这个leading也不生效啊--------------------应该是u和上面没有join条件 只能nest loop 笛卡尔积。这个执行计划出现了nested loops的情况,没有按照hint的指示全部使用hash_join,说明这种hint的写法确实是有问题的。当然是和第一个表V)。

jnrjian的博客 1871

水质和水环境容量计算模型

快速计算环境容量,水质和水环境容量计算模型

上一篇: 面对一个全新的环境,作为一个Oracle DBA,首先应该了解什么
下一篇: 遭遇ORA-600错 参数: [keltnfy-ldmInit]
junmail
博客等级 码龄21年 159粉丝 452原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值