1.笛卡尔积定义

笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join)。所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一数据任意组合,上图中两个表连接即为笛卡尔积(交叉连接)

在实际应用中,笛卡尔积本身大多没有什么实际用处,只有在两个表连接时加上限制条件,才会有实际意义,下面看内连接

示例:

l表

lid         name
----------- --------------------
101         北京
102         太原
101         NULL
102         NULL

matid       qty         lid         mname
----------- ----------- ----------- --------------------
10011       1           101         北京
20012       1           102         太原
10011       1           102         太原
10011       1           102         太原

lm:
lid         name                 matid       qty         lid         mname
----------- -------------------- ----------- ----------- ----------- --------------------
101         北京                   10011       1           101         北京
102         太原                   10011       1           101         北京
101         NULL                 10011       1           101         北京
102         NULL                 10011       1           101         北京
101         北京                   20012       1           102         太原
102         太原                   20012       1           102         太原
101         NULL                 20012       1           102         太原
102         NULL                 20012       1           102         太原
101         北京                   10011       1           102         太原
102         太原                   10011       1           102         太原
101         NULL                 10011       1           102         太原
102         NULL                 10011       1           102         太原
101         北京                   10011       1           102         太原
102         太原                   10011       1           102         太原
101         NULL                 10011       1           102         太原
102         NULL                 10011       1           102         太原

(16 行受影响)

2.笛卡尔积产生原因

  • 表连接缺少关联条件,这个是必须要改的;
  • 表连接有关联条件,但是oracle判断用笛卡尔积更快,也会出现笛卡尔积,这个时候要看实际执行速度;oracle这样判断,一般是表比较小,这个时候要特别检查表的数据量是不是真的很少,以免oracle因为统计信息错误而误判

3.产生笛卡尔积的解决方案

  •   针对 接缺少关联条件导致的笛卡尔积,一般业务是不会直接这么操作的,如果SQL是这样的需要查看SQL是否正确。
  • 针对有关联条件, oracle仍然采用了笛卡尔积的方式 有两种情况

        由于ORACLE判断作笛卡尔积,说明两表关联,至少有一张表是小表,查看执行计划的基数 这个指数如果与实际相同,则建议不作优化修改即可。

        如果查看执行计划的基数与实际基数不同,则由可能是oracle数据误判表的基数,则可采用hint方式,改变SQL的执行过程。

        示例如下:

        

select /*+cardinality(ds, 1000) */  re.usercode "userCode",

re.referrername "userName",

re.referrertel "userPhone",

re.we_chat_id "userWeChat",

decode(re.referrerlevel, 'L3', 'SCR', 'CR') "refLevel"

from l_ds_white_mas ds, l_referrer_mas re, l_ds_white_referrer_rel rel

where rel.usercode = re.usercode

and ds.dsUm = rel.dsUm

and ds.status = 1

and rel.is_effect = 1

and re.iseffective = '1'

and re.status = 1

and re.usercode = :1

最新文章

  1. Git版本控制常用命令整理
  2. C_C++圣战(摘录)
  3. javascript中继承(二)-----借用构造函数继承的个人理解
  4. POJ 1300 Door Man(欧拉回路的判定)
  5. 【CodeForces】【148D】Bag of mice
  6. android中的Cursor类
  7. iOS开发——面试笔试精华(四)
  8. Cocos2D-x权威指南:核心类成员CCNode
  9. window.location.href跳转至空白页
  10. WIN10解决:失败 – 检测到病毒文件下载失败问题
  11. Linux服务器管理神器-IPython
  12. [每天解决一问题系列 - 0013] 如何修改WiX Burn内置的窗口
  13. vi命令详解2
  14. [ADS]An installation support file could not be installed
  15. Android USB gadget configfs学习笔记总结
  16. logback常见配置
  17. bzoj千题计划228:bzoj2095: [Poi2010]Bridges
  18. 字幕字体滚动插件——scroxt.js
  19. “四则运算生成程序——GUI支持和部分功能改进”链接
  20. maven中net.sf.json报错的解决方法

热门文章

  1. (2)集合 遍历set集合
  2. CentOS升级Python2.6到Python2.7并安装pip
  3. WIFI学习笔记
  4. 一张方便的graphql schema 语言手册
  5. linux 下git使用教程
  6. FineUI利用JS取控件的值
  7. Mybatis连接Oracle实现增删改查实践
  8. sysbench 0.5 基准测试
  9. Juery 实现淡出 淡现效果
  10. linux 信号与多线程