sql中的笛卡尔乘积问题

什么是笛卡尔积?笛卡尔积在数学中是一个什么概念?

笛卡尔积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员 而第二个对象是Y的所有可能有序对的其中一个成员。


笛卡尔积又叫笛卡尔乘积,是一个叫笛卡尔的人提出来的。 简单的说就是两个集合相乘的结果。 


假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

笛卡尔积的sql语句(这里只是简单写一条sql举例)

select * from tablea,tableb where tablea.id=tableb.id -- 该条sql语句是:隐式的inner join,显式的inner join为:from tablea inner join tableb on xxx 或 from tablea join tableb on xxx

select * from tablea,tableb 其实可以首先执行这句 sql 就能发现出现的结果是 tablea 的每条记录和 tableb 中的所有记录都生成一条记录。也就是假如 tablea 有10条记录,tableb 有10条记录,最后会产生 100 条记录。


用 where 条件去过滤内容,在数据量不大的时候,问题不大,但是到了比如表 A有1万 数据,表 B有1万 数据,这样的会就会产生 1 亿的数据,然后再用 where 条件去过渡,性能将下降得十分厉害。


如果两张表的数据量比较大,又需要连接查询时,应该使用 FROM tablea JOIN tableb ON xxx 的语法,避免使用 FROM tablea,tableb WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,这同样增加了内存的开销。

如何避免笛卡尔积的sql?

可以使用 join on 避免笛卡尔积问题。select * from tablea join tableb on tablea.id=tableb.id

这条sql语句的执行顺序是 先执行on 中的条件,来连接两条数据,大大的减少了需要排除的数据,然后在 where 条件中再去过滤数据。

尾声

在实际应用过程中通过关联表的最小粒度关联,可以避免产生笛卡尔积。这里的最小粒度可以理解为 表中的唯一性约束的字段。



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与