递归 CTE 很长查询计划的问题

发布于 2025-01-13 04:34:26 字数 1392 浏览 4 评论 0原文

当我执行下面的查询 SQL 时,运行这个计划,花了很长时间来运行它,而且它不会结束。

QueryPlanLink

我在 #T 表中有 300 万条记录。

myCode:

;WITH cte1 AS (
    SELECT NationalId,len(NationalId) as LenNationalId,CustomerType,FullDateInt,time,
         SUM(Price) as SUMPrice
        ,AVG(Price) as Price
        ,SUM(Volume) as  Volume
        ,SUM (sum([Volume])) OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) as SumVol
        ,ROW_NUMBER() OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) AS rn
from #T as T1
group by NationalId,len(NationalId),CustomerType,FullDateInt,time

), rcte AS (
    SELECT *, Price AS Cost , cast(0 as decimal) as Profit
    FROM cte1 AS base
    WHERE base.rn = 1
    UNION ALL
    SELECT curr.*, Case when curr.Volume>0 Then ((curr.Volume *curr.Price) + (prev.Cost*prev.SumVol))/nullif(curr.SumVol,0) 
                        when curr.Volume<0 Then prev.Cost
                   End
    as Cost
    ,ISNULL(Cast (Case when curr.Volume<0 Then -1*(curr.Price-Cost)*curr.Volume End as decimal),0) as Profit
   
   FROM cte1 AS curr
  INNER  JOIN rcte AS prev 
    ON curr.NationalId = prev.NationalId  AND curr.rn = prev.rn + 1
)

Select * from rcte
option (maxrecursion 0) 

有什么办法可以让它变得更好吗?

谢谢

When I execute below query SQL run this plan and it took a long time to run it and it will not be over.

QueryPlanLink

I have 3 million records in #T table.

myCode:

;WITH cte1 AS (
    SELECT NationalId,len(NationalId) as LenNationalId,CustomerType,FullDateInt,time,
         SUM(Price) as SUMPrice
        ,AVG(Price) as Price
        ,SUM(Volume) as  Volume
        ,SUM (sum([Volume])) OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) as SumVol
        ,ROW_NUMBER() OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) AS rn
from #T as T1
group by NationalId,len(NationalId),CustomerType,FullDateInt,time

), rcte AS (
    SELECT *, Price AS Cost , cast(0 as decimal) as Profit
    FROM cte1 AS base
    WHERE base.rn = 1
    UNION ALL
    SELECT curr.*, Case when curr.Volume>0 Then ((curr.Volume *curr.Price) + (prev.Cost*prev.SumVol))/nullif(curr.SumVol,0) 
                        when curr.Volume<0 Then prev.Cost
                   End
    as Cost
    ,ISNULL(Cast (Case when curr.Volume<0 Then -1*(curr.Price-Cost)*curr.Volume End as decimal),0) as Profit
   
   FROM cte1 AS curr
  INNER  JOIN rcte AS prev 
    ON curr.NationalId = prev.NationalId  AND curr.rn = prev.rn + 1
)

Select * from rcte
option (maxrecursion 0) 

Is there any way to make it better?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酷炫老祖宗 2025-01-20 04:34:26

我像下面这样更改我的查询,一切都完成了。感谢大家。

SELECT NationalId,len(NationalId) as LenNationalId,CustomerType,FullDateInt,time,
         SUM(Price) as SUMPrice
        ,AVG(Price) as Price
        ,SUM(Volume) as  Volume
        ,SUM (sum([Volume])) OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) as SumVol
        ,ROW_NUMBER() OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) AS rn
into #TCTE from #T as T1
group by NationalId,len(NationalId),CustomerType,FullDateInt,time



;With rcte AS (
    SELECT *, Price AS Cost , cast(0 as decimal) as Profit
    FROM #TCTE AS base
    WHERE base.rn = 1
    UNION ALL
    SELECT curr.*, Case when curr.Volume>0 Then ((curr.Volume *curr.Price) + (prev.Cost*prev.SumVol))/nullif(curr.SumVol,0) 
                        when curr.Volume<0 Then prev.Cost
                   End
    as Cost
    ,ISNULL(Cast (Case when curr.Volume<0 Then -1*(curr.Price-Cost)*curr.Volume End as decimal),0) as Profit
   
   FROM #TCTE AS curr
  INNER  JOIN rcte AS prev 
    ON curr.NationalId = prev.NationalId  AND curr.rn = prev.rn + 1
)

Select * 
into #TFinal from rcte
option (maxrecursion 0)

I Change My Query like below And Everything is Done. Thanks For All.

SELECT NationalId,len(NationalId) as LenNationalId,CustomerType,FullDateInt,time,
         SUM(Price) as SUMPrice
        ,AVG(Price) as Price
        ,SUM(Volume) as  Volume
        ,SUM (sum([Volume])) OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) as SumVol
        ,ROW_NUMBER() OVER (PARTITION BY NationalId,len(NationalId) ORDER BY FullDateInt,[Time]) AS rn
into #TCTE from #T as T1
group by NationalId,len(NationalId),CustomerType,FullDateInt,time



;With rcte AS (
    SELECT *, Price AS Cost , cast(0 as decimal) as Profit
    FROM #TCTE AS base
    WHERE base.rn = 1
    UNION ALL
    SELECT curr.*, Case when curr.Volume>0 Then ((curr.Volume *curr.Price) + (prev.Cost*prev.SumVol))/nullif(curr.SumVol,0) 
                        when curr.Volume<0 Then prev.Cost
                   End
    as Cost
    ,ISNULL(Cast (Case when curr.Volume<0 Then -1*(curr.Price-Cost)*curr.Volume End as decimal),0) as Profit
   
   FROM #TCTE AS curr
  INNER  JOIN rcte AS prev 
    ON curr.NationalId = prev.NationalId  AND curr.rn = prev.rn + 1
)

Select * 
into #TFinal from rcte
option (maxrecursion 0)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文