陈小咩咩 2020-09-10 17:24 采纳率: 0%
浏览 989

关于 inner join on 后面 + and 的效率讨论

在平时工作中我们经常会用到 inner join ,例如现在我有三个表A,B,C 需要进行关联查询
,一般情况下我们是这样

select * from A 
inner join B on B.aid = A.id
inner join C on c.bid = B.bid
where A.xx = 'xxxx' and B.xx = 'xxx' and c.xx= 'xxx'

三个表进行关联,然后对关联后的结果集进行筛选
然而也有另外一种写法

select * from A 
inner join B on B.aid = A.id and B.xx = 'xxx' 
inner join C on c.bid = B.bid and c.xx= 'xxx'
where A.xx = 'xxxx'

这一种写大致上是说先将B和C进行了条件的筛选后再进行关联,这样关联上的数据明显就少了很多,貌似第二种的效率更高,特别是当B,C表后面用了联合索引时似乎会提升很多,但也会有些情况比如当B,C表后面的几个字段没有联合索引的时候,哪个效率更高呢?欢迎大家讨论和讨究.

  • 写回答

3条回答 默认 最新

  • threenewbee 2020-09-10 18:06
    关注

    后者的效率更高,前者因为有and条件,必须先求迪卡尔积。后者直接hash匹配,快一个数量级。

    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?