Set Statistics IO ON
SET STATISTICS TIME ON
--/*
--原来语句

DECLARE @CkNo nvarchar(4000),@ProWarn int,@SkuWarn int
select @CkNo='D1070',@ProWarn=0,@SkuWarn=0;

Select Count(0) From (Select Cak.Pro_Id from Ck_AreaKuc as Cak
Where AreaType=1 and Cak.CkNo=@CkNo and Cak.Pro_Id in (Select Pro_Id from Pro_List where On_Off_Sale = 0) and Cak.Pro_Id in (select Pro_Id from Ck_Pro_List where CkNo=@CkNo and ProStatus=0 )
Group By Cak.CkNo,Cak.Pro_Id Having IsNull(Sum(Cak.Quantity),0)-IsNull(Sum(Cak.ZyQuantity),0)-(Select IsNull(Sum(Pkul.Pro_Count),0) From Pro_Kuc_Used_List as Pkul Where CkNo=Cak.CkNo and Pro_Id=Cak.Pro_Id)<@ProWarn
or IsNull(Sum(Cak.Quantity),0)-IsNull(Sum(Cak.ZyQuantity),0)-(Select IsNull(Sum(Pkul.Pro_Count),0) From Pro_Kuc_Used_List as Pkul Where CkNo=Cak.CkNo and Pro_Id=Cak.Pro_Id)<(Select IsNull(Sum(ProWarn),0) from Ck_InventoryWarn as Ciw where Ciw.WarnType=1 and Ciw.CkNo=Cak.CkNo and Ciw.Pro_Id=Cak.Pro_Id)
) as A
--*/

go

--改为cte表达式
DECLARE @CkNo nvarchar(4000),@ProWarn int,@SkuWarn int
select @CkNo='D1070',@ProWarn=0,@SkuWarn=0;

WITH
cteZy AS
(
SELECT Pro_Id,IsNull(Sum(Pkul.Pro_Count),0) zyQtyused FROM
Pro_Kuc_Used_List as Pkul Where CkNo=@CkNo GROUP BY Pro_Id
),
cteArea AS
(
Select Cak.Pro_Id ,IsNull(Sum(Cak.Quantity),0) Quantity,IsNull(Sum(Cak.ZyQuantity),0) ZyQuantity from Ck_AreaKuc as Cak
Where AreaType=1 and Cak.CkNo=@CkNo and Cak.Pro_Id in (Select Pro_Id from Pro_List where On_Off_Sale = 0) and Cak.Pro_Id in (select Pro_Id from Ck_Pro_List where CkNo=@CkNo and ProStatus=0 ) Group By Cak.Pro_Id
),
cteWarn AS
(
Select Pro_Id,IsNull(Sum(ProWarn),0) ProWarn from Ck_InventoryWarn as Ciw where Ciw.WarnType=1 and Ciw.CkNo=@CkNo Group By Pro_Id
)

Select Count(0) From cteArea LEFT JOIN cteZy ON cteArea.Pro_Id = cteZy.Pro_Id LEFT JOIN cteWarn ON cteArea.Pro_Id = cteWarn.Pro_Id
WHERE Quantity-ZyQuantity-ISNULL(zyQtyused,0)< @ProWarn OR Quantity-ZyQuantity-ISNULL(zyQtyused,0)< ProWarn

对比:

1. 原来语句

SQL Server 分析和编译时间:
CPU 时间 = 391 毫秒,占用时间 = 475 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(1 行受影响)
表 'Ck_InventoryWarn'。扫描计数 7028,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Pro_Kuc_Used_List'。扫描计数 14056,逻辑读取 28116 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Ck_AreaKuc'。扫描计数 1,逻辑读取 502 次,物理读取 5 次,预读 504 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Pro_List'。扫描计数 1,逻辑读取 21 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Ck_Pro_List'。扫描计数 1,逻辑读取 46 次,物理读取 3 次,预读 57 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 359 毫秒,占用时间 = 518 毫秒。

2. 改为cte表达式

SQL Server 分析和编译时间:
CPU 时间 = 547 毫秒,占用时间 = 1109 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(1 行受影响)
表 'Ck_InventoryWarn'。扫描计数 87,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Ck_Pro_List'。扫描计数 1,逻辑读取 46 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Ck_AreaKuc'。扫描计数 87,逻辑读取 3349 次,物理读取 72 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Pro_List'。扫描计数 0,逻辑读取 174 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Pro_Kuc_Used_List'。扫描计数 1,逻辑读取 4 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 484 毫秒,占用时间 = 1225 毫秒。

3. 结论

没有了子查询,Ck_InventoryWarn表和Pro_Kuc_Used_List表逻辑读会明显减少。

使用CTE减少统计子查询的更多相关文章

  1. Sqlserver 使用CTE如何按子查询排序?

    需求:查出最近有更改的客户信息(按最后更改时间排序,来自SystemLog表LogDateTime字段) 说明: Customer:客户信息表SystemLog:系统日志表,记录所有表信息的增,删,改 ...

  2. 子查询in和表连接效率

    在数据查询时,尽量减少in子查询而使用表连接的方式进行,效率更高.

  3. SQL夯实基础(四):子查询及sql优化案例

    首先我们先明确一下sql语句的执行顺序,如下有前至后执行: (1)from  (2) on   (3) join  (4) where  (5)group by  (6) avg,sum...  (7 ...

  4. Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)

    Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...

  5. sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能

    一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到. 有时是为了让SQL语句的可读性更高些,也可能 ...

  6. MYSQL 查询方法 统计查询 链接查询 子查询

    mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据select Code,Name from Info --查指定列的数据select Code as ...

  7. SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE

    1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...

  8. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  9. postgresql子查询优化(提升子查询)

    问题背景 在开发项目过程中,客户要求使用gbase8s数据库(基于informix),简单的分页页面响应很慢.排查发现分页sql是先查询出数据在外面套一层后再取多少条,如果去掉嵌套的一层,直接获取则很 ...

随机推荐

  1. 《图形学》实验六:中点Bresenham算法画圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...

  2. partial class的使用范围

    Partial Class,部分类 或者分布类.顾名思义,就是将一个类分成多个部分.比如说:一个类中有3个方法,在VS 2005将该类中3个方法分别存放在3个不同的.cs文件中. 这样做的好处: 1. ...

  3. H5中REM中使用的规则

    /*REM单位换算方法 iphone6适配*/ function resizeRoot(){ var Dpr = 1, uAgent = window.navigator.userAgent; var ...

  4. java 猜数字游戏

    作用:猜数字游戏.随机产生1个数字(1~10),大了.小了或者成功后给出提示. 语言:java 工具:eclipse 作者:潇洒鸿图 时间:2016.11.10 >>>>> ...

  5. Leetcode Edit Distance

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  6. java 深度遍历文件夹中的所有文件

    看标题就知道是什么意思了吧,所以就不多说了,直接贴代码: import java.io.*; public class files { private static void iterateFile( ...

  7. mysql数据去除重复及相关优化(转)

    由于mysql不支持同时对一张表进行操作,即子查询和要进行的操作不能是同一张表,因此需要通过临时表中专以下. 1.单字段重复 生成临时表,其中uid是需要去重的字段 create table tmp_ ...

  8. 【Linux】vi 命令

    基本上 vi/vim 共分为三种模式,分别是一般模式.编辑模式与指令列命令模式. 这三种模式的作用分别是:     一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式).在这个模式中 ...

  9. T4学习资料

    网址:http://www.olegsych.com/2007/12/text-template-transformation-toolkit/

  10. HTML当中特殊字符的表示

    (回车换行) <br> (空格符)   &(AND符号) & <(左尖括号.小于号) < >(右尖括号.大于号) > °(度) ° •(间隔符) • ...