值得反复研读的表连接之CARTESIAN JOIN方式
两表关联却无关联条件必会产生笛卡尔积。
[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.0Copyright (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.0sys@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 processedscott@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 processedscott@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方式相关推荐
- 多表联查(多表连接)(join)
多表联查(多表连接)(join) 1. 分类 内连接.自然连接.外链接(左外连接.右外连接.全外连接(mysql不支持)) 2. 内连接 inner join(等值连接,制定对应的等值条件) SELE ...
- SQL表连接的几种方式
表连接的几种方式 表 表连接 分类 举例说明 表 这里有两张表,分别为学生表和选课表 students sno s_name gender age height speciality 1001 张三 ...
- Oracle-多表连接的三种方式解读
概述 在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 下面是从10053事件中截取的部分trace原文件. Join order[2]: T[T]#1 T1[T1] ...
- 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...
- 成为优秀Java开发者,这本书值得反复研读
一.导读 学习Java的经典名著非常多,这本书是你一定不能错过的:由凯.霍斯特曼写的<Core Java>,中文版名为<Java核心技术>.这本书几乎出现在每个"学J ...
- Oracle表连接优化思路
Oracle表连接类型: 一.嵌套查询 嵌套循环的算法:在嵌套循环连接中,有驱动顺序,驱动表返回多少条记录,被驱动表就访问多少次,嵌套循环连接中无须排序. 嵌套循环可以快速返回两表关联的前几条数据,如 ...
- oracle 表连接 大表小表_优化必备基础:Oracle中常见的三种表连接方式
在Oracle SQL语句中,如果from后面有多个表时,表的连接方式是一个很重要的考量. 从Oracle 6开始,优化器就支持下面4种表连接方式: - 嵌套循环连接(Nested Loop Join ...
- Oracle 多表 连接 顺序 与 性能关系 测试
一. 创建表并insert 数据 create table ta (id number,name varchar2(10)); create table tb(id number,job varcha ...
- 【PHP MySQL】数据库专题 第八课 表连接
[PHP & MySQL]✔️数据库专题✔️ 第八课 表连接 概述 表连接 内连接 左连接 右连接 全连接 概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 表连接 表连接 ...
- MySQL学习(8)︱DISTINCT去重与表连接
DISTINCT去重 distinct用于在查询中返回列的唯一不同值(去重复),支持单列或多列.在实际的应用中,表中的某一列含有重复值是常见的,如employee表的dept列.如果在查询数据时,希望 ...
最新文章
- 时代亿信 认证墙-SID强身份认证产品
- Linux命令的实现 -- ls pwd cd
- Linux tcpdump命令
- Makefile_02:程序的编译和链接
- 自拟计算机作文100字,介绍电脑的作文100字
- 策略模式(stragegy)
- [shell进阶]——shell多线程
- Storm 1.1.0 集群安装
- 工程应用中的自相关操作
- JavaScript编写了一个计时器
- java主函数_《左手 Java 右手 Python 》之 Java 的安装与初识(1)
- tcp/ip协议listen函数中backlog参数的含义
- centos7 下安装生物信息软件的问题小总结
- 如何解决谷歌浏览器插件屏蔽问题
- 思科路由器防火墙如何配置的方法
- 中国计量大学matlab,计量经济学及matlab.pdf
- 2021-07-09 二维码扫码支付开展进程、主要类型及面临的环境政策
- excel两个表格数据对比_excel如何1秒钟合并两个不同表格数据?收下这个方法吧...
- c语言单片机的电子琴课程设计,基于单片机的电子琴的设计
- 数据库 --- 表的创建(DDL)以及数据的插入、修改和删除(DML)
热门文章
- 怎么去掉win7开始菜单中的睡眠和休眠选项
- ​NeurIPS 2022 | IPMT:用于小样本语义分割的中间原型挖掘Transformer
- 面向初学者的 Python IDE:Thonny,你值得一试
- 2014微软校园招聘笔试试题(英文)
- psql屏幕输出全部结果_液晶电视无法开机,是电源板问题还是屏幕问题,自己动手维修...
- 世界各个国家echarts地图展示
- 小程序微信商家API V3对接转账到零钱(JAVA)
- SSDT表函数Hook原理
- HDU6069(数学)
- 苹果手机使用技巧篇:教你完美使用好苹果手机的4个方法