在执行计划中,有时会出现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
相关推荐
Oracle中merge into的使用 很有用的哦 学习一下
关于Oracle中merge into的用法,比较实用哦
浅谈Oracle数据库中Merge Into的用法.pdf
oracle merge 用法详解
oracle使用 merge 更新或插入数据(总结)
在对传统的Sort-Merge-Join算法进一步研究的基础上,提出了一种改进的闪存数据库Sort-Merge-Join算法。该算法只对小关系进行外排序,避免了大关系的外排序,节省了大量时间,同时最小化了中间临时表,达到了少写闪存...
主要介绍了oracle中merge into用法及实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://forlan.iteye.com/blog/2245814
在Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入(insert)数据行。。。。。。
oracle merge into的使用,开发必备的。
oracle Merge 函数
oracle使用 merge 更新或插入数据(总结@新
oracle同一个表中使用merge
在任何数据库中发生死锁都是不愉快的,即使是在一个特殊的情况下发生也是如此,它们会减小应用程序的接受程度(ACCEPTANCE),因此避免并正确解释死锁是非常重要的。
主要介绍了在MySQL中实现插入或更新操作(类似Oracle的merge语句)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
数据库 我自己在 Java 中实现了 SortMergeJoin 和 HashJoin(来自 SQL 的著名 INNER JOIN)。 在更多信息。
关于数据库oracle merge RGE INTO newmergetest m using ...