使用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是先查询出数据在外面套一层后再取多少条,如果去掉嵌套的一层,直接获取则很 ...
随机推荐
- 从Eclipse迁移到Android Studio碰到的问题记录
背景: 1. 一直在做.NET的开发,工作之余,学习了一下Android开发,写了一些Demo,当时用的Eclipse开发工具:这两天,刚好项目不是很忙,就打算把之前写的Demo,迁移到Android ...
- AngularJs2 学习之路-笔记1-Atscript Ts ES6包含关系
Atscript 这门新的语言是由谷歌的Angular团队弄出来的 就是为了编写ng2.0 ng2是个极具前瞻性的尝试 这种激进的革新在于对未来标准的迎合 ng2的标准包括了如下:1 module 2 ...
- 使用python解析Json字符串-获取Json字符串关键字
import json data = { "statusCode": 0, "data": { ", "height": &quo ...
- VBA 获取Sheet最大行
compared all possibilities with a long test sheet: 0,140625 sec for lastrow = calcws.Cells.Find(&quo ...
- Codeforces Round #279 (Div. 2) vector
A. Team Olympiad time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Unity Lightmap动态加载研究
什么情况下需要Lightmap? 移动平台上目前暂时还不能开实时光影效果,会卡成幻灯片.所以就需要将光影烘焙到贴图上. 什么情况下需要动态加载Lightmap? 1.当项目抛弃了Unity的多场景模式 ...
- ZeroMQ接口函数之 :zmq_msg_init - 初始化一个空的ZMQ消息结构
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_init zmq_msg_init(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...
- Java的序列化ID的作用
Java的序列化ID的作用 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersio ...
- C#怎样通过url调用接口
在做一些项目过程中,我们常常总避免不了要调用接口,那么怎么通过url调用借口呢.我今天浅显的写一下. 首先要获取你访问链接的App Key 和 App Secret 那么什么是App Key 和 Ap ...
- Invoke-Command和-ComputerName 效率比较
看到网上有文章说Invoke-Command的方式相较其他方式的效率要高,特地试验了一下,但是这个实验不是很好: 机器只有2台 0. 用Get-WinEvent,日志数=200,Invoke方式快 1 ...