数据库环境: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 减少表扫描次数的更多相关文章

  1. Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表

    1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...

  2. Oracle全表扫描

    优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...

  3. 表访问方式---->全表扫描(Full Table Scans, FTS)

    全表扫描(Full Table Scans, FTS) 全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位 ...

  4. SQL 数据优化索引建suo避免全表扫描

    首先什么是全表扫描和索引扫描?全表扫描所有数据过一遍才能显示数据结果,索引扫描就是索引,只需要扫描一部分数据就可以得到结果.如果数据没建立索引. 无索引的情况下搜索数据的速度和占用内存就会比用索引的检 ...

  5. MySql避免全表扫描【转】

    原文地址:http://blog.163.com/ksm19870304@126/blog/static/37455233201251901943705/ 对查询进行优化,应尽量避免全表扫描,首先应考 ...

  6. Mysql避免全表扫描sql查询优化 .

    对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: ·   使用ANALYZE TABLE tbl_n ...

  7. MySql避免全表扫描

    对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: · 使用ANALYZE TABLE tbl_name为 ...

  8. SQL中哪些情况会引起全表扫描

    1.模糊查询效率很低:原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like '%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的关 ...

  9. 【转】避免全表扫描的sql优化

    对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描:· 使用ANALYZE TABLE tbl_name为扫 ...

随机推荐

  1. 【转】Eclipse 中设置JVM 内存 -- 不错

    原文网址:http://www.xuebuyuan.com/569653.html java.lang.OutOfMemoryError: Java heap space 从上边的异常信息可以看到,J ...

  2. js数组如何去掉逗号

    技术水平比较差,有错误的地方或者大神们有好的方法在介绍下,可以指点出来我加以改正! 1.join去掉逗号',' var a = ['1', '2', '3', '4', '5']; var c = a ...

  3. JS倒计时 代码

    JS倒计时 代码 <div> <span id="KSD">3</span>天 <span id="KSH">1 ...

  4. parseSdkContent failed Could not initialize class android.graphics.Typeface

    Deleting ".android" is temporarily fixing the problem with me as after sometime it begins ...

  5. maven构建带版本号和日期的war包名

    21166312 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !import ...

  6. 51单片机连接24C02-C语言测试代码

    忙了一天多终于透彻了,自己写的不好使,用别人的逐步分析改成自己的,我写得非常简洁易懂. 我总结3点需要注意的地方 1.关闭非IIC通信器件,比如我的开发板SDA和SCL也连接了DS1302,造成干扰会 ...

  7. Spark RDD概念学习系列之rdd持久化、广播、累加器(十八)

    1.rdd持久化 2.广播 3.累加器 1.rdd持久化 通过spark-shell,可以快速的验证我们的想法和操作! 启动hdfs集群 spark@SparkSingleNode:/usr/loca ...

  8. CocoaPods不更新spec仓库进行install/update

    最近使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动 原因在于当执行以上两个命令的时候会升级Co ...

  9. load 与initialize的调用顺序小结

    开发中实用方法固然是最贴近应用的,当一些程序原理还是要先搞清晰,根据查找的一些资料,总结了一些load与initialize的调用. APP启动到执行main函数之前,程序就执行了很多代码   执行顺 ...

  10. WCF客户端和服务器时间不一致,导致通道建立失败的问题)

    本文转载:http://www.cnblogs.com/bcbr/articles/2288374.html 最近,经常有客户反应,前天还用的好好的系统,今天就不能用了. 考虑到系统近来没有做过改动和 ...