文档章节

SQL Server的WHERE条件"短路评价"大杀器CASE WHEN

Q_J
 Q_J
发布于 2016/06/09 22:29
字数 807
阅读 83
收藏 7
点赞 0
评论 0

可惜证据文档取不出来,而且冗长,就大致做个备忘录,有心的人看看就明白了。


1. 条件里没有子查询 -> 短路评价

SELECT * FROM test WHERE some_fast_check()=1 OR some_slow_check(c) = 1

2. 条件里有子查询,但子查询是针对真实表的 -> 准“短路评价”

SELECT * FROM test WHERE some_fast_check()=1 OR c IN (SELECT * FROM normal_or_temp_table)

需要注意的是:子查询一定会最先执行,相当于先做成一个内存表,勉强说得过去,但是万一这个子查询很慢,偏偏第一个条件已经满足了的时候,那就悲剧了,拖累了整个速度

的确,如果第一个条件满足的话,这之后对于形成的内存表进行Scan的次数=0,所以说这是准 “短路评价”。


3. 条件里有子查询,且使用了“表函数” -> 开始失去控制了。

SELECT * FROM test WHERE some_fast_check()=1 OR c IN (SELECT * FROM some_slow_data())

尤其是上述例子里“标量函数”和“表函数”混合的,是最超乎想象的,这时,

some_slow_data()表函数一定最先被执行一次以便其产生内存表,这个只好忍了。

但是这之后就不可忍了!对于这个内存表,总会被进行N次Scan,而N显然取决于主表里符合其他条件的件数。

就是说就算所有行的some_fast_check()=1已经为true了,这后面针对内存表的Scan还是继续做!

傻啊。没办法,从Plan看就是这样的,SQL Server就是这么任性。

当然,结果速度快不快,还要取决于优化器否决定并发执行,有时也不慢。


4. 短路评价大杀器"CASE WHEN"

例如把下面这句整体当做一个表达式来评价时,当"快速条件"满足了时,整个表达式就出结果(1)了,"慢速条件"都不会被执行,

CASE WHEN 快速条件 THEN 1 WHEN 慢速条件 THEN 1 ELSE 0 END

于是,整个SQL改成:

SELECT * FROM test WHERE 
    CASE WHEN some_fast_check()=1 THEN 1
         WHEN c IN (SELECT * FROM some_slow_data()) THEN 1
         ELSE 0
    END = 1

就可以变快了。


 

还有,不知道DB为什么没有默认开启RECOMPILE选项,这个选项会减少哪些不必要的子查询。

测试时,必须注意用dbcc命令清楚缓存,具体的命令一查就行。

另外一个确定的经验是,IN换成EXISTS或者TABLE JOIN的方式在第一次执行时(没有缓存),Plan是一样的,后来有了Cache之后,TABLE JOIN方式就快些。

© 著作权归作者所有

共有 人打赏支持
Q_J

Q_J

粉丝 12
博文 66
码字总数 54682
作品 0
日本
《SQLSERVER2012之T-SQL教程》T-SQL单表查询(二)

表结构与数据:https://github.com/XuePeng87/TSQLV4 谓词和运算符 1) 谓词 T-SQL支持的谓词例子包括IN、BETWEEN和LIKE。 IN可以检查一个值或是一个标量表达式是否至少等于集合中的一个元素。...

杰克鹏仔
2016/11/09
8
0
2.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(二)

表结构与数据:https://github.com/XuePeng87/TSQLV4 谓词和运算符 1) 谓词 T-SQL支持的谓词例子包括IN、BETWEEN和LIKE。 IN可以检查一个值或是一个标量表达式是否至少等于集合中的一个元素。...

巧乐兹
2016/10/25
2
0
Oracle短路 “filter(NULL IS NOT NULL)”

CopyFrom: http://www.cnblogs.com/fangwenyu/p/3305394.html 了不起的 “filter(NULL IS NOT NULL)” 经常会在执行计划中看到很奇怪的"FILTER"操作,然后看对应的执行信息是"filter(NULL IS...

yqh_2000
2015/01/30
0
0
JS简写技巧,让你写代码速度翻倍(一)

1.三元操作符 当想写if...else语句时,使用三元操作符来代替。 简写: 也可以嵌套if语句: 2.短路求值简写方式 当给一个变量分配另一个值时,想确定源始值不是null,undefined或空值。可以写...

可乐瓶的小辣椒
01/22
0
0
oracle pl/sql 从if 到 then的“艺术鉴赏”

在oracle开发中,if和then之间的条件表达式,有很多行为充满“艺术”,需要我们去发现,去鉴赏。 欣赏一:三值逻辑 如果一个表达式中包含null值,那么表达式的最终结果会是什么呢?比如:240...

长平狐
2012/09/19
64
0
Java-J2SE基础复习

1、Java的安装 1.1、安装路径问题: 特别注意:安装的路径不能有空格,也不能有中文,建议安装在d:/java/jdk,安装JRE的时候规则一样! 1.2、常用dos命令 1、dir :查看当前文件。 2、cd :进...

pmos
2016/03/14
38
0
短路逻辑和延迟加载

一、短路逻辑 短路逻辑(short-circuit logic)也叫懒惰求值(lazy evaluation),在我们熟知的布尔运算中有一个非常有趣的特性:只有在需要求值时才进行求值。举例来说,ConditionA() and ...

嗯哼9925
2017/11/09
0
0
运算符_键盘录入_流程控制语句

一、运算符 (1)算术运算符 ①单目:+(取正)、-(取负)、++(自增)、- -(自减) ②双目:+、-、*、/、%(取余) ③三目:比较表达式?表达式1:表达式2; (2)位移运算符 <<(带符号左移)、>>(带符号右移...

icecoola_
2017/04/05
0
0
MySQL · 捉虫动态 · order by limit 造成优化器选择索引错误

问题描述 bug 触发条件如下: 优化器先选择了 where 条件中字段的索引,该索引过滤性较好; SQL 中必须有 order by limit 从而引导优化器尝试使用 order by 字段上的索引进行优化,最终因代价...

阿里云RDS-数据库内核组
2015/11/09
0
0
ASP NET的学习

使用WebService 使用CSS布局 使用ASP控件 CheckBoxList DropDownMenuList 容器控件 Panel PlaceHolder Calendar控件 viewState记住控件的状态 数据结构 数组 string[] roles=new string[2]; ......

云飞扬v5
2015/10/11
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
9
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0
python从零学——scrapy初体验

python从零学——scrapy初体验 近日因为一些事情,需要从网上爬取一些东西,故而想通过使用爬虫来顺便学习下强大的python。现将一些学习中遇到的问题记录下来,以便日后查询 1. 开发环境的准...

咾咔叽
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部