`

Oracle中的merge join Cartesian

 
阅读更多

在执行计划中,有时会出现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

分享到:
评论

相关推荐

    Kettle 合并记录和Merge Join组件实现数据增量迁移(数据同步比插入更新快

    在本文中,我们将深入探讨“合并记录”和“Merge Join”这两个组件在实现数据增量迁移中的作用,以及为什么它们在数据同步时比传统的插入更新更快。 首先,我们来理解什么是数据增量迁移。在数据仓库或数据库系统中...

    Oracle中merge into的使用

    在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...

    浅谈Oracle数据库中Merge Into的用法.pdf

    Oracle 数据库中 Merge Into 的用法 在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则...

    oracle merge 用法详解

    1. **UPDATE或INSERT子句成为可选项**:与Oracle 9i不同的是,在Oracle 10g中,`MERGE`语句允许用户只指定`UPDATE`或`INSERT`中的任意一个操作。 2. **支持WHERE子句**:在`UPDATE`和`INSERT`子句后可以添加`WHERE`...

    Oracle merge into用法

    在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...

    Oracle_merge

    本文将详细介绍 Oracle 中 `MERGE` 关键字的使用方法,并结合实际示例来解析其工作原理。 #### 二、`MERGE` 语句的基本概念 在 Oracle 9i R2 版本之前,如果需要同时进行更新和插入操作,开发人员通常需要编写两条...

    oracle使用 merge 更新或插入数据(总结)

    oracle使用 merge 更新或插入数据(总结)

    oracle merge into的使用

    描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为灵活和高效的数据管理方式。在...

    oracle死锁原因解决办法

    在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。死锁不仅影响数据库性能,还会影响应用程序的可用性和用户...

    Oracle中hash join研究.pdf

    【Oracle中的Hash Join详解】 哈希连接(Hash Join)是Oracle数据库中的一种高效连接方法,主要针对等值连接操作,其引入旨在解决嵌套循环连接(Nested Loop Join)中的大量随机读取问题以及排序合并连接(Sort-...

    oracle中merge into用法及实例解析

    Oracle中的`MERGE INTO`语句是一种强大的工具,用于整合数据操作,如更新、插入和删除,基于两个数据源的匹配条件。这个语句在处理数据仓库、数据同步或者复杂业务逻辑时非常有用。让我们详细了解一下`MERGE INTO`的...

    oracle Merge 函数.doc

    Oracle Merge 函数是一种强大的数据操作语句,用于从一个表中选择一些数据更新或者插入到另一个表中。Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge ...

    kettle实现SQL关联查询

    "Merge Join" Step就是其中之一,它允许用户实现类似SQL中的各种类型关联查询,包括INNER JOIN、LEFT JOIN、RIGHT JOIN以及FULL JOIN。 INNER JOIN是SQL中的一种基本联接类型,它返回两个表中存在匹配的记录。在...

    Oracle CBO 学习笔记之(1) : 深入理解Oracle Hash Join的代价模型及其执行流程

    在这个学习笔记中,我们将深入探讨Oracle中的Hash Join操作,这是一种重要的联接(JOIN)类型,尤其在处理大数据量时能展现高效的性能。 Hash Join的基本原理是通过构建一个哈希表来实现两个表的连接。首先,Oracle...

    tud-db:我自己在 Java 中实现 SortMergeJoin 和 HashJoin(来自 SQL 的著名 INNER JOIN)

    本篇文章将重点讨论如何在Java中实现两种常见的JOIN算法:SortMergeJoin和HashJoin。 一、SortMergeJoin SortMergeJoin是一种基于排序的JOIN算法,它的基本思想是首先对参与JOIN的两个关系(即表)按照JOIN条件...

    oracle同一个表中使用merge.txt

    oracle同一个表中使用merge

    Oracle表连接方式

    根据不同的数据集和查询需求,Oracle提供了多种表连接方式,包括NESTED LOOP、HASH JOIN和SORT MERGE JOIN等。 NESTED LOOP NESTED LOOP是一种基本的表连接方式,适用于被连接的数据子集较小的情况。在nested loop...

Global site tag (gtag.js) - Google Analytics