使用CTE减少统计子查询
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减少统计子查询的更多相关文章
- Sqlserver 使用CTE如何按子查询排序?
需求:查出最近有更改的客户信息(按最后更改时间排序,来自SystemLog表LogDateTime字段) 说明: Customer:客户信息表SystemLog:系统日志表,记录所有表信息的增,删,改 ...
- 子查询in和表连接效率
在数据查询时,尽量减少in子查询而使用表连接的方式进行,效率更高.
- SQL夯实基础(四):子查询及sql优化案例
首先我们先明确一下sql语句的执行顺序,如下有前至后执行: (1)from (2) on (3) join (4) where (5)group by (6) avg,sum... (7 ...
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...
- sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能
一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到. 有时是为了让SQL语句的可读性更高些,也可能 ...
- MYSQL 查询方法 统计查询 链接查询 子查询
mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据select Code,Name from Info --查指定列的数据select Code as ...
- SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE
1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- postgresql子查询优化(提升子查询)
问题背景 在开发项目过程中,客户要求使用gbase8s数据库(基于informix),简单的分页页面响应很慢.排查发现分页sql是先查询出数据在外面套一层后再取多少条,如果去掉嵌套的一层,直接获取则很 ...
随机推荐
- Delphi DLL的创建、静态及动态调用
转载:http://blog.csdn.net/welcome000yy/article/details/7905463 结合这篇博客:http://www.cnblogs.com/xumenger/ ...
- Pyqt adb 获取Android手机屏幕
adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...
- 哈,我自己翻译的小书,马上就完成了,是讲用python处理大数据框架hadoop,spark的
花了一些时间, 但感觉很值得. Big Data, MapReduce, Hadoop, and Spark with Python Master Big Data Analytics and Dat ...
- windows 10 设置
精简应用 邮件和日历: Get-AppxPackage *communi* | Remove-AppxPackage 新闻: Get-AppxPackage *bing* | Remove-AppxP ...
- ios数据永久存储之----NSUserDefaults
我们在开发app时不可避免的会在本地存储一些数据,NSUserDefaults就是系统提供的一个用来数据存储的类,本片文章就来介绍一些NSserdefazults的用法. 详细内容:https://m ...
- Codeforces Round #375 (Div. 2)
A. The New Year: Meeting Friends 水 #include <set> #include <map> #include <stack> ...
- C#连接Access数据库(详解)
做一个用VS2012的C#连接Access数据库的备忘, SQL数据库固然强大,有大微软的强力技术支持,LINQ的方便操作,但是如果写一个小程序对数据库方面没有什么大的要求的话,将来在数据库方面就可以 ...
- WebForm控件Repeater
我们会发现用拼接字符串来显示一个查询非常的麻烦,有一个控件Repeater帮助你,省去写Foreach LinQ to SQL类 函数类: using System; using System.Col ...
- CentOS 6.5 下安装 Redis 2.8.7
wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make ...
- 1.0 Quartz 2D 简介
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” Quartz2D须知: (1)Quartz 2D是苹果官方的二维绘图引擎,同时支持 ...