always on 自动表分区_left join(on&where)

02749780f7d1bf548f032fcdb3a021fb.png

1

表结构


1

医生主表

d8df8c0e82ad54af6195ce1e78fe90b7.png

2

医生服务次数表

2aa6619a5e8bee7353a41bd961cae461.png

2

left join 查询

1

on后面加and条件

sql语句

407e57f64182b7510d0417fc6fb868f7.png

查询结果

cffca982b65a414386b90af9851eb0d5.png

执行计划

ae81b896940f8b7acf2208c1ebe3a176.png

54d57e11e5774f415bc1e95094269290.png

2

把条件放在where后面

 sql语句

8288f2ec41151bc3c7497b46cd2705df.png

查询结果

6bd848548e28efbd36699b4a8af2f53e.png

执行计划

0252644505779d83d1c683e8d1872bc6.png

c4347da2ac2197be1187827232287a16.png

3

总结

  • 不考虑where条件下,left join 会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符合就显示,不符合全部为null)

  • 在匹配阶段,where子句的条件都不会被使用,仅在匹配阶段完成以后,where子句条件才会被使用,它将从匹配阶段产生的数据中检索过滤

  • 所以左连接关注的是左边的主表数据,不应该把on后面的从表中的条件加到where后,这样会影响原有主表中的数据

  • where后面:是先连接然生成临时查询结果,然后再筛选

     on后面:先根据条件过滤筛选,再连接生成临时查询结果

以下结论由群友大佬提供:

有谓词下推的情况下查询结果没有区别。没有谓词下推的情况下,在执行计划中会对on的条件内的子查询先进行过滤,最后再将结果根据where条件过滤,对于这种情况,应当尽可能的将子查询以及管理表的数据量减少以提升查询性能,避免笛卡尔积等情况。

从功能上来区分,on的结果是临时表,where是对on的临时结果做过滤。

谓词下推:

优化关系 SQL 查询的一项基本技术是,将外层查询块的 WHERE 子句中的谓词移入所包含的较低层查询块(例如视图),从而能够提早进行数据过滤以及有可能更好地利用索引。

这在分区数据库环境中甚至更为重要,其原因在于,提早进行过滤有可能减少必须在数据库分区之间传递的数据量。

此优化技术在 SQL 中被称为谓词下推(Predicate pushdown) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值