用true/false短路语句的方式不适用于带join的语句

本文探讨了SQL中利用变量判断实现短路优化的方法,并通过具体案例分析了在带有JOIN操作的查询中,如何通过调整查询语句和执行计划来减少不必要的I/O操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 用变量判断的方式可以让条件为false时不产生IO,例如下面的语句,由于(@a=0)==false,因此不会有IO产生

declare @a bit
set @a=1
select dlydata2.Comment
from dlydata2
where @a=0;


2. 很容易想到的是,在有join语句的环境下,也使用这种方式,例如下面的语句,希望的结果是,这个语句也不产生IO:

declare @a bit
set @a=1
select dlydata2.Comment
from dlydata2   inner join dlyndx2 on (dlydata2.VchCode=dlyndx2.Vchcode and@a=0)
where @a=0;


3. 实际结果是:



4. 为什么会在dlyndx2上有IO?接着来分析执行计划


(1)试验一
declare @a bit
set @a=1
select dlydata2.Comment
from dlydata2  inner join dlyndx2 on (dlydata2.VchCode=dlyndx2.Vchcode and @a=0)
where @a=0;

表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'dlyndx2'。扫描计数 1,逻辑读取 973 次,物理读取 16 次,预读 973 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。



分析:
    1)执行计划选择hash join方式,且选择了dlyndx2作为左表;
    2)执行计划会默认把where条件的筛选器加到原始sql语句的左表上,因此@a=0对dlyndex2不起作用,hash join会对左表dlyndx2先做个scan。

(2)试验二
基于前面的分析,用实验二来验证想法:
      1)强制hash join
      2)去掉并发
      3)调换左右表顺序

select dlydata2.Comment
from dlydata2
inner hash join dlyndx2 on (dlydata2.VchCode=dlyndx2.Vchcode and @a=0)
where @a=0 option(maxdop 1);

表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。




5. 结论

想要通过true/false来短路带join的语句,即希望在条件不符合时不扫描所有表的方法,其效果是不稳定的,优化的时候要注意。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值