两表连接一:嵌套循环连接

简介: 一、前言:对于一名有志于成为SQL调优的开发人员或SQL的DBA,就很有必要了解下ORACLE数据库在对两个表进行连接时的运行机制,因为再复杂的执行计划也是每次分解成两个表的连接去执行的。

一、前言:对于一名有志于成为SQL调优的开发人员或SQL的DBA,就很有必要了解下ORACLE数据库在对两个表进行连接时的运行机制,因为再复杂的执行计划也是每次分解成两个表的连接去执行的。ORACLE数据库有常见的三种连接表的方法:嵌套循环连接、合并连接、哈希连接。本文档通过实验的方法总结这三种连接的应用和影响性能的因素;

 

二、嵌套循环连接的预备知识:本文档主要介绍嵌套循环连接,因此先了解嵌套循环连接的一些基础知识,打好基础知识,才更容易学习。

1、概念:嵌套循环连接处理的两个数据集被称为外部循环(也叫驱动表)和内部循环,当外部循环执行一次的时候,内部循环需要针对外部循环返回的每条记录执行一次;

 

2、特性:在所有的数据返回之前,就可以返回结果的提一条数据;

         可以有效的利用索引来处理限制条件与连接条件;

         支持所有类型的连接;

3、优化器会按照一定的规则来决定两张表谁是驱动表、谁是被驱动表。

   

二、测试环境说明:数据库版本:11.2.0.3

表A1     NUM_ROWS    3,658,250(百万级别),没有索引脚本:create table hr.A1 as select * from all_objects;(然后运行以下脚本几次,产生大量的数据   insert into hr.a1 select * from hr.a1)

表B1    NUM_ROWS  100CREATE TABLE HR.B2(ID  NUMBER)

 

 

测试方法:

通过HINT去改变ORACLE两表连接产生的执行计划,并对比几种执行计划的效率;(友情提示:执行计划的查看方法,请在本博客中查找)

 

测试一:b1为内表,运行嵌套循环连接

脚本:

select /*+ ordered use_nl(b1) */ *

from a1,b1

where a1.object_id=b1.id ;

 

执行计划:

解读:

外表A1运行一次后,执行一次B1的全表扫描,然后再根据条件进行过滤,外部表A1合计运行3658次的外部循环;

计划时间:16:35:25

 

测试二:a1为内表,运行嵌套循环连接

脚本:

select /*+ ordered use_nl(a1) */ *

from a1,b1

where a1.object_id=b1.id ;

 

执行计划:

解读:

外表B1运行一次后,执行一次A1的全表扫描,然后再根据条件进行过滤,外部表B1合计运行100次的外部循环;

计划时间:00:02:53

 

结论一:在最简单的两表的嵌套循环连接过程中,行数较少的表应该为驱动表,会有更高的执行效率,但是这个行为是ORACLE本身来决定,而决定的这个动作主要由各表的统计信息,所以当对整个执行计划有疑问时,请检查统计信息是否正确;

 

测试三:连接条件增加索引,在表A1的object_id列上面增加索引;

脚本:

select  /*+ USE_NL_WITH_INDEX(a1 A1_ID) */  *

from a1,b1

where a1.object_id=b1.id ;

解读:当A1表增加索引后,外部表循环B1完成一次后,内表可以通过这个值去搜索索引,根据索引后的结果再到A1表获取数据,避免了全表扫描;

 

结论二:在嵌套循环连接中,连接条件中可以用到索引,如果内表的选择性很强,那么在调优的过程中,可以增加连接条件为索引;

相关文章
|
开发工具 git
|
存储 大数据 测试技术
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
在大数据环境中,数据存储格式直接影响查询性能和成本。本文探讨了 Parquet、Avro 和 ORC 三种格式在 Google Cloud Platform (GCP) 上的表现。Parquet 和 ORC 作为列式存储格式,在压缩和读取效率方面表现优异,尤其适合分析工作负载;Avro 则适用于需要快速写入和架构演化的场景。通过对不同查询类型(如 SELECT、过滤、聚合和联接)的基准测试,本文提供了在各种使用案例中选择最优存储格式的建议。研究结果显示,Parquet 和 ORC 在读取密集型任务中更高效,而 Avro 更适合写入密集型任务。正确选择存储格式有助于显著降低成本并提升查询性能。
1252 1
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
|
12月前
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1008 2
|
8月前
|
算法 安全 大数据
【算法备案新风向】个人信息保护合规审计来了!关键点全解读
国家网信办发布《个人信息保护合规审计管理办法》,自2025年5月1日起施行。该办法适用于所有在中国境内处理个人信息的主体,特别是处理超1000万人信息的企业需每两年审计一次。触发审计情形包括重大风险、侵害个人权益或大规模信息泄露。企业可自行或委托专业机构审计,报告需报送相关部门。违规将依据《个人信息保护法》处理,严重者追究刑事责任。此举旨在保护个人隐私、规范企业运营,提升公众信任。企业和个人应积极响应,共同营造安全可信的数字环境。
|
中间件 数据库 数据安全/隐私保护
Django框架的深入探索与实践
本文介绍了Django,一个流行的Python Web框架,以其优雅设计和强大功能吸引开发者。Django遵循MVC模式,提供URL路由、模板引擎和ORM等核心组件,强调高效简洁的开发方式。文中详细阐述了Django的安装配置过程,核心组件包括URL路由、视图模板和模型ORM。此外,还探讨了Django的表单处理、用户认证、中间件和信号等进阶应用。Django凭借其不断发展的特性和全面的Web开发解决方案,持续受到开发者的青睐。【6月更文挑战第8天】
262 4
|
12月前
|
运维 安全 jenkins
Jenkins适合哪些场景
【10月更文挑战第18天】Jenkins适合哪些场景
|
12月前
|
JavaScript 测试技术 API
跟随通义灵码一步步升级vue2(js)项目到vue3版本
Vue 3 相较于 Vue 2 在性能、特性和开发体验上都有显著提升。本文介绍了如何利用通义灵码逐步将 Vue 2 项目升级到 Vue 3,包括备份项目、了解新特性、选择升级方式、升级依赖、迁移组件和全局 API、调整测试代码等步骤,并提供了注意事项和常见问题的解决方案。
888 4
|
12月前
|
数据采集 监控 安全
厂区地图导航制作:GIS技术与路径导航算法融合
在智能化、数字化时代,GIS技术为厂区的运营管理带来了革命性变化。本文探讨了如何利用GIS技术,通过数据采集、地图绘制、路径规划、位置定位和信息查询等功能,打造高效、精准的智能厂区地图导航系统,提升企业的竞争力和管理水平。
569 0
厂区地图导航制作:GIS技术与路径导航算法融合
|
12月前
|
安全 网络安全 网络虚拟化
Cisco-路由器单臂路由配置
Cisco-路由器单臂路由配置
260 0
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
互联网时代呼唤‘新中文‘的崛起 - 谈谈象形文字在如今分词方法下面临的挑战
本文探讨了汉字在互联网和大模型时代的挑战与机遇,分析了汉字在创造新词、自然语言处理等方面的局限性,并提出了“新中文”概念,包括二维部首组合法、拼音化与语调简化等创新方法,旨在保留汉字文化精髓的同时,提升其在数字时代的适应性和处理效率。
384 0