• 使用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表逻辑读会明显减少。

  • 相关阅读:
    【Python基础】04_Python中的if判断语句
    【Python基础】03_Python中的命名和关键字
    【Python基础】02_Python中变量的输入输出
    【Python基础】01_Python中的变量
    三、gridView增删改查
    二、MVC3+EF单表增删改查
    一、简单gridview列表展示
    oracle账户密码过期,修改为无限制
    提取年
    如何找到记录的子记录
  • 原文地址:https://www.cnblogs.com/059212315/p/5880842.html
Copyright © 2020-2023  润新知