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

数据库之SQL笛卡尔积的更多相关文章

  1. Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)

    为了梦想与了信仰    开局一张图   主要三个方面: 1.Linux终端命令 2.MySQL语句 3.Python调用   先删库 再跑路.....                         ...

  2. 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划

    淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...

  3. 淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成物理查询计划

    SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理运行计划. 前两个步骤请參见我的博客<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树>& ...

  4. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  5. 如何转换SQL Server 2008数据库到SQL Server 2005

        背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...

  6. jdbc向各种数据库发送sql语句

    1.有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Info ...

  7. SQL---Chapter01 数据库和SQL

    数据库类型: 层次数据库(Hierarchical Database, HDB) 数据通过层次结构(树形结构)的方式表示出来. 关系型数据库(Relational Database, RDB) 使用专 ...

  8. 总结一些关于操作数据库是sql语句还是存储过程问题

    总结一些关于操作数据库是sql语句还是存储过程问题 程序中,你跟数据的交互,需要向数据库拿数据.更改数据库的数据等,这些操作,本身不是程序完成的,而是程序发命令给数据库去做的,不管是通过sql语句方式 ...

  9. SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句

    附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...

随机推荐

  1. convertTo函数

    前言 使用opencv常常会需要用到数据类型之间的转换,此时需要使用convertTo函数. 代码: cv::Mat samples; cv::Mat tdata; samples.convertTo ...

  2. opencv-python教程学习系列1-安装库

    前言 以后的项目可能会用到python和opencv进行实现,故准备opencv-python教程学习系列记录学习过程的点滴,这是这一系列的开篇,坚持学习,共同进步. 系列教程参照OpenCV-Pyt ...

  3. POI的简单使用

    一:简介 利用POI工具可以导出word,excel,ppt等office文件 二:程序代码示例 package com.wang.test; import java.io.File; import ...

  4. Fire! 又是图 bfs

    Joe works in a maze.  Unfortunately, portions of the maze havecaught on  re, and the owner of the ma ...

  5. 字符串的比较【string和字符数组】

    无论是string 还是 字符数组的字符串比较函数,返回的都是字典序的大小.如 1234 和 5 比较时就是1234的字典序小于5,要想比较字符串表示的数字的大小,需要自己写函数比较

  6. 【vue】Vue调试神器vue-devtools安装

    转载:https://segmentfault.com/a/1190000009682735 前言 vue-devtools是一款基于chrome游览器的插件,用于调试vue应用,这可以极大地提高我们 ...

  7. 实现JMS规范的ActiveMQ

    ActiveMQ是Apache软件基金会的开源产品,支持AMQP协议.MQTT协议(和XMPP协议作用类似).Openwire协议和Stomp协议等多种消息协议.并且ActiveMQ完整支持JMS A ...

  8. POJ1734无向图求最小环

    题目:http://poj.org/problem?id=1734 方法有点像floyd.若与k直接相连的 i 和 j 在不经过k的情况下已经连通,则有环. 注意区分直接连接和间接连接. * 路径记录 ...

  9. Linux中CPU亲和性(go)

    http://www.cnblogs.com/LubinLew/p/cpu_affinity.html

  10. AIX6.1用g++安装Poco-1.6.1-all

    项目终于到了把程序往小型机上部署的阶段了.不得不说AIX真是让人恶心,一个Poco编译弄了我1周时间.网上根本没有相关的资料. 1. AIX下安装gcc/g++:在ftp://ftp.software ...