在执行计划中,有时会出现CARTESIAN笛卡尔乘积,简单的说一下什么叫cartesian?就是有两个集合,每个集合的任意一个成员都要与另外一个集合的任意一个成员有关联...下面是关于cartesian的一些实验:
SQL> set linesize 2000
SQL> select * from tab;
TNAMETABTYPECLUSTERID
------------------------------ ------- ----------
TTABLE
REP_T_LOGTABLE
SQL> select * from t,rep_t_log
Execution Plan
----------------------------------------------------------
Plan hash value: 2235198130
----------------------------------------------------------------------------------
| Id| Operation| Name| Rows| Bytes | Cost (%CPU)| Time|
----------------------------------------------------------------------------------
|0 | SELECT STATEMENT|| 20000 |429K|16(7)| 00:00:01 |
|1 |MERGE JOIN CARTESIAN|| 20000 |429K|16(7)| 00:00:01 |
|2 |TABLE ACCESS FULL| REP_T_LOG |2 |30 |3(0)| 00:00:01 |
|3 |BUFFER SORT|| 10000 | 70000 |13(8)| 00:00:01 |
|4 |TABLE ACCESS FULL | T| 10000 | 70000 |6(0)| 00:00:01 |
----------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
SQL>
如果强制不允许merge join Cartesian出现,可以通过设置隐含参数“_optimizer_mjc_enabled”
SQL> alter session set "_optimizer_mjc_enabled" = false;
Session altered.
SQL> select * from t,rep_t_log;
Execution Plan
----------------------------------------------------------
Plan hash value: 4018263157
--------------------------------------------------------------------------------
| Id| Operation| Name| Rows| Bytes | Cost (%CPU)| Time|
--------------------------------------------------------------------------------
|0 | SELECT STATEMENT|| 20000 |429K|16(7)| 00:00:01 |
|1 |NESTED LOOPS|| 20000 |429K|16(7)| 00:00:01 |
|2 |TABLE ACCESS FULL| REP_T_LOG |2 |30 |3(0)| 00:00:01 |
|3 |TABLE ACCESS FULL| T| 10000 | 70000 |6(0)| 00:00:01 |
--------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
SQL> conn / as sysdba
Connected.
在整个系统级禁用笛卡尔乘积
SQL> alter system set "_optimizer_mjc_enabled" = false;
System altered.
SQL> conn test/test
Connected.
SQL> set autotrace trace exp
SQL>select * from t,rep_t_log;
Execution Plan
----------------------------------------------------------
Plan hash value: 4018263157
--------------------------------------------------------------------------------
| Id| Operation| Name| Rows| Bytes | Cost (%CPU)| Time|
--------------------------------------------------------------------------------
|0 | SELECT STATEMENT|| 20000 |429K|16(7)| 00:00:01 |
|1 |NESTED LOOPS|| 20000 |429K|16(7)| 00:00:01 |
|2 |TABLE ACCESS FULL| REP_T_LOG |2 |30 |3(0)| 00:00:01 |
|3 |TABLE ACCESS FULL| T| 10000 | 70000 |6(0)| 00:00:01 |
--------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
当出现merge join Cartesian时,sql的执行效率可能会很低,对于系统的隐藏参数,一般不应该改变。
转自:http://hi.baidu.com/xiaoxiaosir/blog/item/318cec2929cae6f699250abf.html
相关推荐
在本文中,我们将深入探讨“合并记录”和“Merge Join”这两个组件在实现数据增量迁移中的作用,以及为什么它们在数据同步时比传统的插入更新更快。 首先,我们来理解什么是数据增量迁移。在数据仓库或数据库系统中...
在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...
Oracle 数据库中 Merge Into 的用法 在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则...
1. **UPDATE或INSERT子句成为可选项**:与Oracle 9i不同的是,在Oracle 10g中,`MERGE`语句允许用户只指定`UPDATE`或`INSERT`中的任意一个操作。 2. **支持WHERE子句**:在`UPDATE`和`INSERT`子句后可以添加`WHERE`...
在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...
本文将详细介绍 Oracle 中 `MERGE` 关键字的使用方法,并结合实际示例来解析其工作原理。 #### 二、`MERGE` 语句的基本概念 在 Oracle 9i R2 版本之前,如果需要同时进行更新和插入操作,开发人员通常需要编写两条...
oracle使用 merge 更新或插入数据(总结)
描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为灵活和高效的数据管理方式。在...
在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。死锁不仅影响数据库性能,还会影响应用程序的可用性和用户...
【Oracle中的Hash Join详解】 哈希连接(Hash Join)是Oracle数据库中的一种高效连接方法,主要针对等值连接操作,其引入旨在解决嵌套循环连接(Nested Loop Join)中的大量随机读取问题以及排序合并连接(Sort-...
Oracle中的`MERGE INTO`语句是一种强大的工具,用于整合数据操作,如更新、插入和删除,基于两个数据源的匹配条件。这个语句在处理数据仓库、数据同步或者复杂业务逻辑时非常有用。让我们详细了解一下`MERGE INTO`的...
Oracle Merge 函数是一种强大的数据操作语句,用于从一个表中选择一些数据更新或者插入到另一个表中。Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge ...
"Merge Join" Step就是其中之一,它允许用户实现类似SQL中的各种类型关联查询,包括INNER JOIN、LEFT JOIN、RIGHT JOIN以及FULL JOIN。 INNER JOIN是SQL中的一种基本联接类型,它返回两个表中存在匹配的记录。在...
在这个学习笔记中,我们将深入探讨Oracle中的Hash Join操作,这是一种重要的联接(JOIN)类型,尤其在处理大数据量时能展现高效的性能。 Hash Join的基本原理是通过构建一个哈希表来实现两个表的连接。首先,Oracle...
本篇文章将重点讨论如何在Java中实现两种常见的JOIN算法:SortMergeJoin和HashJoin。 一、SortMergeJoin SortMergeJoin是一种基于排序的JOIN算法,它的基本思想是首先对参与JOIN的两个关系(即表)按照JOIN条件...
oracle同一个表中使用merge
根据不同的数据集和查询需求,Oracle提供了多种表连接方式,包括NESTED LOOP、HASH JOIN和SORT MERGE JOIN等。 NESTED LOOP NESTED LOOP是一种基本的表连接方式,适用于被连接的数据子集较小的情况。在nested loop...