用true/false短路语句的方式不适用于带join的语句
来源:互联网 发布:csol三米优化刀 编辑:程序博客网 时间:2024/05/06 06:22
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作为左表;
1)执行计划选择hash join方式,且选择了dlyndx2作为左表;
2)执行计划会默认把where条件的筛选器加到原始sql语句的左表上,因此@a=0对dlyndex2不起作用,hash join会对左表dlyndx2先做个scan。
(2)试验二
基于前面的分析,用实验二来验证想法:
1)强制hash join
2)去掉并发
3)调换左右表顺序
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的语句,即希望在条件不符合时不扫描所有表的方法,其效果是不稳定的,优化的时候要注意。
- 用true/false短路语句的方式不适用于带join的语句
- SQL的JOIN语句
- mysql的join语句
- SQL的JOIN语句
- true false 与TRUE FALSE 的区别
- FALSE/TRUE与false/true的区别
- FALSE/TRUE与false/true的区别
- FALSE/TRUE与false/true的区别
- FALSE/TRUE与false/true的区别
- sql语句的join用法
- 有意思的 left join 语句
- sql语句的join用法
- Mysql join语句的优化
- Mysql join语句的优化
- jquery 中代替return false的语句
- Python的while语句(continue,break,True)
- bbs的态度,不适用于blog?
- TCP不适用于实时传输的原因
- 矩阵分解
- MFC使用技巧篇(一)
- HDU1003: Max Sum
- Oracle Memory Architecture - Oracle 体系结构篇 5
- 简介
- 用true/false短路语句的方式不适用于带join的语句
- 路径参数函数:路径的获取(GetModuleFileName)和拆分(_splitpath)
- Android 使用多个Intent 进行activity跳转 而没有finish的情况,如何直接退出系统
- PAT_1041: Be Unique
- common-io之Comparator阅读
- javascript检查表单数据是否改变
- PKU 2886 反素数+线段树
- Exception when run load test use visual studio.
- PHP中set_time_limit