gpt4 book ai didi

sql - 查询包括子查询和分组比预期慢

转载 作者:行者123 更新时间:2023-12-04 23:51:24 24 4
gpt4 key购买 nike

下面的整个查询运行得非常慢。

子查询[别名 Stage_1] 仅用时 1.37 分钟返回 9514 条记录,但整个查询耗时 20 多分钟,返回 2606 条记录。

我可以使用#temp 表来保存子查询以提高性能,但我不想这样做。

查询的概述是表 WeeklySpace 内部连接到 SpaceblockName_SID 上的 Spaceblock_Name_to_PG 表,这减少了 WeeklySpace 中的结果并将 PG_Code 包含在 WeeklySpace 中的结果中。 WeeklySpace 然后跨 3 个字段完全外部连接到 Sales_PG_Wk。 where 子句关注结果,并且可以更改。然后将子查询的结果相加。由于使用了 group by 和 sum,您无法在子查询中进行最终求和。

我认为这个问题是由于在最后的 sum'ing 中分组期间重复计算子查询造成的。字段 SpaceblockName_SID 似乎也与导致问题有关,因为没有它,子查询中分组依据的运行时间不受影响。

我已经阅读了很多建议,尝试全部解决问题。

这些包括;

  • 将 TOP 2147483647 添加到 Order by 以强制中间具体化,在子查询中和使用 CTE。
  • 在 stage_1 之后添加连接。
  • 将 SpaceblockName_SID 从 int 转换为 varchar,然后再转换回来

子查询和整个查询的执行计划(分成两部分,显示在代码下方)看起来很相似。成本在我预期的 Full Outer Join(哈希匹配)附近。

查询在 T-SQL 2005 上运行。

非常感谢任何帮助!

select 
Cost_centre
, Fin_week
, SpaceblockName_SID
, sum(Propor_rep_SRV) as Total_SpaceblockName_SID_SRV
from
(
select
coalesce(space_side.fin_week , sales_side.fin_week) as Fin_week
,coalesce(space_side.cost_centre , sales_side.cost_Centre) as Cost_centre
,space_side.SpaceblockName_SID
,case
when space_side.SpaceblockName_SID is null
then sales_side.SalesExVAT
else sum(space_side.TLM)
/nullif(sum (sum(space_side.TLM) ) over (partition by coalesce(space_side.fin_week , sales_side.fin_week)
, coalesce(space_side.cost_centre , sales_side.cost_Centre)
, coalesce( Spaceblock_Name_to_PG.PG_Code, sales_side.PG_Code)) ,0)*sales_side.SalesExVAT
end as Propor_rep_SRV
from
WeeklySpace as space_side
INNER JOIN
Spaceblock_Name_to_PG
ON space_side.SpaceblockName_SID = Spaceblock_Name_to_PG.SpaceblockName_SID
and Spaceblock_Name_to_PG.PG_Code < 10000
full outer join
sales_pg_wk as sales_side
on space_side.fin_week = sales_side.fin_week
and space_side.Cost_Centre = sales_side.Cost_Centre
and Spaceblock_Name_to_PG.PG_code = sales_side.pg_code
where
coalesce(space_side.fin_week, sales_side.fin_week) between 201538 and 201550
and
coalesce(space_side.cost_centre, sales_side.cost_Centre) in (3, 2800)
group by
coalesce(space_side.fin_week, sales_side.fin_week)
,coalesce(space_side.cost_centre, sales_side.cost_Centre)
,coalesce( Spaceblock_Name_to_PG.PG_Code, sales_side.PG_Code)
,sales_side.SalesExVAT
,space_side.SpaceblockName_SID
) as stage_1
group by
Cost_centre
, Fin_week
, SpaceblockName_SID

执行计划左侧 Execution plan left hand side


执行计划右侧 Execution plan left hand side

最佳答案

您没有提到在您查询中使用的那些列上是否创建了索引。如果不是,则创建并检查查询的性能

关于sql - 查询包括子查询和分组比预期慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30236598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com