Oracle join类型及其性能对比分析

 更新时间:2026年02月03日 14:37:38   作者:promise524  
本文详细介绍了Oracle中连接查询的多种类型及其性能对比,包括内连接、外连接、自连接、交叉连接和Oracle专有语法,还探讨了连接效率的影响因素,如连接字段是否建索引、表大小和连接方式选择,并提供了性能优化建议,最后,通过一个高效连接案例总结了文章内容

在 Oracle 中,连接查询(JOIN) 的连接类型及其性能对比

一、Oracle中的连接方式分类与语法

1. 内连接(INNER JOIN)

返回两个表中满足连接条件的记录。

SELECT *
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id;

特点:

  • 只返回匹配的行。
  • 是最常用的连接。
  • 如果不指定连接方式(如使用 ,WHERE),默认是内连接。

2. 外连接(OUTER JOIN)

a)左外连接(LEFT OUTER JOIN)

返回左表的全部记录,如果右表中没有匹配的记录,则右表列为 NULL。

SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id;

b)右外连接(RIGHT OUTER JOIN)

返回右表的全部记录,左表没有匹配记录的列为 NULL。

SELECT *
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.id = t2.id;

c)全外连接(FULL OUTER JOIN)

返回两个表中的全部记录,没有匹配的部分列为 NULL。

SELECT *
FROM table1 t1
FULL OUTER JOIN table2 t2 ON t1.id = t2.id;

3. 自连接(SELF JOIN)

同一个表连接自身。

SELECT a.name, b.name
FROM employee a
JOIN employee b ON a.manager_id = b.id;

4. 交叉连接(CROSS JOIN)

返回两个表的笛卡尔积(每个表1条记录,两表组合1×1条记录)。

SELECT *
FROM table1
CROSS JOIN table2;

5. Oracle 专有语法:旧式连接(+)

SELECT *
FROM table1 t1, table2 t2
WHERE t1.id = t2.id(+);
-- 等价于 LEFT JOIN

二、连接查询的性能效率比较

连接类型行数大小关系匹配情况性能优化建议
INNER JOIN常见,性能最好有匹配高效使用索引字段连接
LEFT JOIN左大右小不一定匹配中等尽量加过滤条件
RIGHT JOIN左小右大不一定匹配中等同上,尽量避免
FULL OUTER JOIN大数据慎用不一定匹配低效避免在大数据量上使用
CROSS JOIN小表可用,谨慎使用无条件连接最低通常不推荐
SELF JOIN中等有匹配中等注意表别名

三、连接效率影响因素详解

1. 连接字段是否建索引

  • 有索引:优化器可快速查找匹配项(Nested Loop)。
  • 无索引:可能全表扫描(Hash Join、Merge Join)。

2. 表大小(数据量)

  • 小表连接快,大表连接要谨慎。
  • Oracle 优化器会根据统计信息选择合适连接方式。

3. 连接方式选择

  • INNER JOIN 优于 OUTER JOIN
  • OUTER JOIN 多用于有缺失数据容忍时

4. Oracle 执行计划(EXPLAIN PLAN)

建议使用如下命令查看连接执行方式:

EXPLAIN PLAN FOR 
SELECT ...
FROM ...
WHERE ...;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

四、连接算法(Oracle执行时选择)

算法特点适用情况
Nested Loop Join一条一条查找小表驱动大表,有索引时最佳
Hash Join建立哈希表进行匹配大表连接,大量数据无索引时
Merge Join对两个表排序再合并连接列已排序或排序开销可接受

五、性能优化建议

  • 优先使用 INNER JOIN,避免 FULL OUTER JOIN。
  • 连接字段建立索引(特别是被驱动表的连接键)。
  • 使用 WHERE 限定连接数据范围
  • 避免连接过多大表(建议 ≤ 4 张表)
  • 开启并更新表的统计信息,使 Oracle 优化器选择最佳执行计划。
  • 避免在连接字段上使用函数或类型转换,否则索引失效。
  • 使用临时表(WITH 或 MATERIALIZED VIEW)分步处理复杂连接逻辑

六、高效连接案例

多表连接,带索引、过滤条件

SELECT o.order_id, c.customer_name, p.product_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN products p ON o.product_id = p.product_id
WHERE o.order_date >= SYSDATE - 30;
  • 三表 INNER JOIN
  • 所有连接字段建立索引
  • 限定最近 30 天数据,减少扫描量

七、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Oracle中的定时任务实例教程

    Oracle中的定时任务实例教程

    定时任务相信大家都不陌生,下面这篇文章主要给大家介绍了关于Oracle中定时任务的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • Oracle8i和Microsoft SQL Server比较

    Oracle8i和Microsoft SQL Server比较

    Oracle8i和Microsoft SQL Server比较...
    2007-03-03
  • Oracle通过递归查询父子兄弟节点方法示例

    Oracle通过递归查询父子兄弟节点方法示例

    这篇文章主要给大家介绍了关于Oracle如何通过递归查询父子兄弟节点的相关资料,递归查询对各位程序员来说应该都不陌生,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • oracle数据库中如何处理clob字段方法介绍

    oracle数据库中如何处理clob字段方法介绍

    在知识库的建立的时候,用普通VARCHAR2存放文章是显然不够的,本文将详细将介绍oracle数据库中如何处理clob字段方法,需要的朋友可以参考下
    2012-11-11
  • Oracle如何批量将表中字段名全转换为大写(利用简单存储过程)

    Oracle如何批量将表中字段名全转换为大写(利用简单存储过程)

    这篇文章主要给大家介绍了关于Oracle如何批量将表中字段名全转换为大写的相关资料,主要利用的就是一个简单的存储过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Oracle 11g 客户端的安装和配置的图文教程

    Oracle 11g 客户端的安装和配置的图文教程

    这篇文章主要介绍了 Oracle 11g 客户端的安装和配置的图文教程,需要的朋友可以参考下
    2017-05-05
  • oracle数据库中查看系统存储过程的方法

    oracle数据库中查看系统存储过程的方法

    这篇文章主要介绍了oracle数据库中查看系统存储过程的方法,需要的朋友可以参考下
    2014-06-06
  • Oracle表空间大小如何查看及扩增

    Oracle表空间大小如何查看及扩增

    Oracle数据库中,表空间是存储数据对象的关键结构,管理表空间包括监控其大小并根据需要进行扩展,以确保数据库运行高效,查看表空间大小,可以通过SQL查询或使用Oracle Enterprise Manager,扩展表空间的方法有手动增加数据文件
    2024-10-10
  • Windows系统安装Oracle 11g 数据库图文教程

    Windows系统安装Oracle 11g 数据库图文教程

    这篇文章主要介绍了Windows系统安装Oracle 11g 数据库图文教程,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解

    ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解

    这篇文章主要给大家介绍了关于ORACLE如何检查找出损坏索引(Corrupt Indexes)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-09-09

最新评论