两表关联却无关联条件必会产生笛卡尔积。

[oracle@MaxwellDBA ~]$ sqlplus sys/sys as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Oct 23 10:50:01 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

sys@cdb$root:orclcdb> ALTER SESSION SET CONTAINER=ORCLPDB1;

Session altered.

sys@cdb$root:orclcdb> conn SCOTT/TIGER@ORCLPDB1;
Connected.
scott@orclpdb1:orclcdb>
scott@orclpdb1:orclcdb> set autot trace;
scott@orclpdb1:orclcdb>
scott@orclpdb1:orclcdb> select * from emp,dept;

56 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 2034389985

-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |    56 |  3248 |    10   (0)| 00:00:01 |
|   1 |  MERGE JOIN CARTESIAN|      |    56 |  3248 |    10   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL  | DEPT |     4 |    80 |     3   (0)| 00:00:01 |
|   3 |   BUFFER SORT        |      |    14 |   532 |     7   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL | EMP  |    14 |   532 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Statistics
----------------------------------------------------------
         97  recursive calls
          0  db block gets
        218  consistent gets
         30  physical reads
          0  redo size
       4393  bytes sent via SQL*Net to client
        417  bytes received via SQL*Net from client
          5  SQL*Net roundtrips to/from client
         16  sorts (memory)
          0  sorts (disk)
         56  rows processed

scott@orclpdb1:orclcdb>

执行计划中MERGE JOIN CARTESIAN表明为笛卡尔连接。笛卡尔会返回两个表的乘积。

DEPT 4 rows

EMP 14 rows

两表的乘积则为56 rows

BUFFER SORT 表示对其中以表进行排序。

在多表关联的时候,两个表没有直接关联条件,但是优化器错误地把某个表返回的Rows算为1行(注意必须是1行),这个时候也可能发生笛卡尔儿连接。

如果两表有直接关联条件,无法控制两个表进行笛卡尔连接。

如果两表没有直接关联条件,可将两个表依次放在from后面并且添加HINT:ordered,就可以使两表进行笛卡尔积关联

scott@orclpdb1:orclcdb> set autot trace
scott@orclpdb1:orclcdb>
scott@orclpdb1:orclcdb> select /*+ ordered */
  2  a.ename, a.sal, a.deptno, b.dname,c.grade
from dept b, salgrade c, emp a
  4  where a.deptno = b.deptno
  5  and a.sal between c.losal and c.hisal;

14 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 2197699399

----------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |    42 |  1512 |    13   (0)| 00:00:01 |
|*  1 |  HASH JOIN            |          |    42 |  1512 |    13   (0)| 00:00:01 |
|   2 |   MERGE JOIN CARTESIAN|          |    20 |   460 |    10   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL  | DEPT     |     4 |    52 |     3   (0)| 00:00:01 |
|   4 |    BUFFER SORT        |          |     5 |    50 |     7   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL | SALGRADE |     5 |    50 |     2   (0)| 00:00:01 |
|   6 |   TABLE ACCESS FULL   | EMP      |    14 |   182 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("A"."DEPTNO"="B"."DEPTNO")
       filter("A"."SAL"<="C"."HISAL" AND "A"."SAL">="C"."LOSAL")

Statistics
----------------------------------------------------------
         52  recursive calls
          0  db block gets
         62  consistent gets
          8  physical reads
          0  redo size
       1263  bytes sent via SQL*Net to client
        741  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
         14  rows processed

scott@orclpdb1:orclcdb>

DEPT 和 SALGRADE没有直接关联条件,HINT:ordered表示根据SQL语句中from后面表的顺序依次关联。故DEPT与SALGRADE只能进行笛卡尔连接。

Q:当执行计划中有笛卡尔连接应该怎么优化?

Step1: 检查表与表之间是否存在关联条件,如果没有,可咨询开发与业务人员为何没有关联条件。是否是为了满足业务的需求的某种原因而故意不写关联条件。

Step2 : 检查离笛卡尔连接最近的表是否真的返回1行数据,如果返回行数真的只有1行,那么走笛卡尔连接是没有问题的。如果超过一行,说明估算错误,同时要纠正估算错误的Rows。纠正错误的Rows之后,优化器就不会走笛卡尔连接了。

同时,可以使用HINT/*+ opt_param('_optimizer_mjc_enabled','false')*/ 禁止笛卡尔连接。

值得反复研读的表连接之CARTESIAN JOIN方式相关推荐

  1. 多表联查(多表连接)(join)

    多表联查(多表连接)(join) 1. 分类 内连接.自然连接.外链接(左外连接.右外连接.全外连接(mysql不支持)) 2. 内连接 inner join(等值连接,制定对应的等值条件) SELE ...

  2. SQL表连接的几种方式

    表连接的几种方式 表 表连接 分类 举例说明 表 这里有两张表,分别为学生表和选课表 students sno s_name gender age height speciality 1001 张三 ...

  3. Oracle-多表连接的三种方式解读

    概述 在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 下面是从10053事件中截取的部分trace原文件. Join order[2]: T[T]#1 T1[T1] ...

  4. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

  5. 成为优秀Java开发者,这本书值得反复研读

    一.导读 学习Java的经典名著非常多,这本书是你一定不能错过的:由凯.霍斯特曼写的<Core Java>,中文版名为<Java核心技术>.这本书几乎出现在每个"学J ...

  6. Oracle表连接优化思路

    Oracle表连接类型: 一.嵌套查询 嵌套循环的算法:在嵌套循环连接中,有驱动顺序,驱动表返回多少条记录,被驱动表就访问多少次,嵌套循环连接中无须排序. 嵌套循环可以快速返回两表关联的前几条数据,如 ...

  7. oracle 表连接 大表小表_优化必备基础:Oracle中常见的三种表连接方式

    在Oracle SQL语句中,如果from后面有多个表时,表的连接方式是一个很重要的考量. 从Oracle 6开始,优化器就支持下面4种表连接方式: - 嵌套循环连接(Nested Loop Join ...

  8. Oracle 多表 连接 顺序 与 性能关系 测试

    一. 创建表并insert 数据 create table ta (id number,name varchar2(10)); create table tb(id number,job varcha ...

  9. 【PHP MySQL】数据库专题 第八课 表连接

    [PHP & MySQL]✔️数据库专题✔️ 第八课 表连接 概述 表连接 内连接 左连接 右连接 全连接 概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 表连接 表连接 ...

  10. MySQL学习(8)︱DISTINCT去重与表连接

    DISTINCT去重 distinct用于在查询中返回列的唯一不同值(去重复),支持单列或多列.在实际的应用中,表中的某一列含有重复值是常见的,如employee表的dept列.如果在查询数据时,希望 ...

最新文章

  1. Jpa-操作mongodb
  2. matlab 最后一列,求大神帮我解释一下matlab最后几行是什么意思
  3. 一次http完整的请求tcp报文分析
  4. 朗读评价语言集锦_干货 | 教师课堂评价规范用语的几点建议,建议收藏!
  5. linux清除asm磁盘分区,ASM Diskgroup添加与删除
  6. python怎么读取csv文件-使用Python读写csv文件的三种方法
  7. proxmoxve打造云桌面_最大亮点!山东众志电子为山东财经大学东方学院打造首个200点位云桌面考场...
  8. 清明上河图密码2笔记
  9. python实现输出日历_python实现输入日期打印日历
  10. Html+JavaScript猜数字游戏
  11. AR 和 VR 的开源平台
  12. 5G网络架构及其对承载网的影响
  13. 做一个软件需要了解的知识
  14. 文本效果-white-space、overflow、text-overflow
  15. 滴滴全民拼车日背后的运维技术揭秘
  16. 人机大战?——带你玩转三子棋(C语言)
  17. 批处理判断文件夹是否为空
  18. k2677场效应管参数引脚_场效应管参数
  19. 简单总结无线CPE、无线AP、无线网桥的不同之处【转】
  20. CTF平台题库writeup(一)--南邮CTF-WEB(部分)

热门文章

  1. 华为荣耀7i刷linux,奇兔刷机独家支持华为荣耀7i一键刷机 全网首发刷机ROM包
  2. Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
  3. mac电脑怎么彻底删除卸载桌面软件图标的软件?
  4. Flutter上线项目实战——环信客服插件
  5. 通过jad/mc/redefine命令,在docker容器中实现动态更新代码的功能:
  6. 航弈单通道脑电设备通过lsl在Matlab中接收数据
  7. android融云客服功能,客服开发指南 - 融云 RongCloud
  8. 基于just work的LE legacy pairing过程
  9. ubuntu清空回收站命令
  10. Cura工程环境配置教程