利用case when 减少表扫描次数
数据库环境:SQL SERVER 2008R2
有网友希望有人帮他优化一下他的SQL,SQL语句如下:
WITH T AS (
SELECT B.O_Money MON,B.O_States STATES FROM M_Basket A
JOIN M_OrderInfo B ON A.OrderID=B.ID WHERE A.GoodID=@GOODSID
),
B AS (
SELECT (SELECT SUM(MON) FROM T)SumMoney,
(SELECT SUM(MON) FROM T WHERE STATES IN (2,3,4))ComfirmMoney,
(SELECT COUNT(*) FROM T WHERE STATES=2)AleadyDrive,
(SELECT COUNT(*) FROM T WHERE STATES=3)AleadyPay,
(SELECT COUNT(*) FROM T WHERE STATES=4)AleadyComfirm
)
INSERT @BIAO
SELECT * FROM B
看了一下语句,有可能出问题的地方,是with B 里面的内容,T表被访问了4次,
稍微转换一下思路,用case when来改写这段,就可以让T表只访问1次。
改写的SQL如下:
WITH T AS ( SELECT B.O_Money MON ,
B.O_States STATES
FROM M_Basket A
JOIN M_OrderInfo B ON A.OrderID = B.ID
WHERE A.GoodID = @GOODSID
),
B AS ( SELECT SUM(MON) AS SumMoney ,
SUM(CASE WHEN STATES IN ( 2, 3, 4 ) THEN MON
END) AS ComfirmMoney ,
COUNT(CASE WHEN STATES = 2 THEN 1
END) AS AleadyDrive ,
COUNT(CASE WHEN STATES = 3 THEN 1
END) AS AleadyPay ,
COUNT(CASE WHEN STATES = 4 THEN 1
END) AS AleadyComfirm
FROM T
)
INSERT @BIAO
SELECT *
FROM B
(本文完)
利用case when 减少表扫描次数的更多相关文章
- Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表
1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...
- Oracle全表扫描
优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...
- 表访问方式---->全表扫描(Full Table Scans, FTS)
全表扫描(Full Table Scans, FTS) 全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位 ...
- SQL 数据优化索引建suo避免全表扫描
首先什么是全表扫描和索引扫描?全表扫描所有数据过一遍才能显示数据结果,索引扫描就是索引,只需要扫描一部分数据就可以得到结果.如果数据没建立索引. 无索引的情况下搜索数据的速度和占用内存就会比用索引的检 ...
- MySql避免全表扫描【转】
原文地址:http://blog.163.com/ksm19870304@126/blog/static/37455233201251901943705/ 对查询进行优化,应尽量避免全表扫描,首先应考 ...
- Mysql避免全表扫描sql查询优化 .
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: · 使用ANALYZE TABLE tbl_n ...
- MySql避免全表扫描
对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: · 使用ANALYZE TABLE tbl_name为 ...
- SQL中哪些情况会引起全表扫描
1.模糊查询效率很低:原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like '%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的关 ...
- 【转】避免全表扫描的sql优化
对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描:· 使用ANALYZE TABLE tbl_name为扫 ...
随机推荐
- 【转】JAVA字符串格式化-String.format()的使用--不错
原文网址:http://blog.csdn.net/lonely_fireworks/article/details/7962171 常规类型的格式化 String类的format()方法用于创建格式 ...
- [转]NHibernate之旅(9):探索父子关系(一对多关系)
本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...
- 基于.NET平台常用的框架和开源程序整理
自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中 也积累了一些开源的组件,就目前想到的先整理于此,如果再想到, ...
- 理解c++11正则表达式 (1)
概要 C++11提出了正则表达式这个概念,只需在头文件中包含#include<regex>即可.我们可以完成: Match 将整个输入拿来比对匹配某个正则表达式 Search 查找与正则表 ...
- CodeFirst-数据迁移-Migration
http://www.cnblogs.com/haogj/archive/2012/02/17/2356537.html 1.安装最新NuGet 2.安装EntityFramework:在程序包管理器 ...
- Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1728 Solved: 649[Submit][Statu ...
- Eclipse SVN插件安装与使用(2014.12.27——by小赞)
安装参考:http://www.cnblogs.com/xdp-gacl/p/3497016.html 用法参考:http://blog.sina.com.cn/s/blog_8a3d83320100 ...
- Python默认编码错误SyntaxError: Non-ASCII character '\xe5'之解决方法
在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* 解决方法: py ...
- java第一章到第四章
class HelloWorld{ public static void main(String [] arguments) { System.out.println("Hello Worl ...
- myeclipse输入“.”后没有自动提示功能
今天和室友安装了一样的myeclipse版本,结果室友的自动提示功能有,我的输入"."后却不能提示,这对我们敲代码简直来说是一个折磨,不能自动提示,本来还以为是系统问题,一个是wi ...