【问题标题】:Improve performance of select on select query using temp table使用临时表提高选择查询的选择性能
【发布时间】:2019-02-11 21:40:00
【问题描述】:

对于表格结构,该表格包含每个国家/地区的每周产品价格。 我的目标是为每种产品在每个国家/地区的最近一周/年中选择每种产品的最低价格。 下面的查询实现了这个目标,但性能相当缓慢。我想知道是否有更有效的方法来完成相同的任务。

在第一部分中,我选择每个国家/地区的最新价格年份和周数。我包括了 CASE 何时计入新年。 我将其保存在#temptable 中。 然后我根据之前选择的年、周和国家组合选择最低价格。

DECLARE @date DATE SET @date=getdate()

SELECT YearNb, Max(WeekNb) AS WeekNb, ISOCountryCode INTO #TempTable FROM PriceBenchWeekly  
WHERE PriceBenchWeekly.YearNb = CASE WHEN DATEPART(ww,@date)  = 1 THEN
                Year(@date)-1
                ELSE
                Year(@date)
                END
GROUP BY YearNb, ISOCountryCode

SELECT ProdNb,Min(WeeklyPrice) AS MinPrice, MarketPlayerCode, 'MKT' AS PriceOriginTypeCode, NatCoCode
FROM CE.PriceBenchWeekly INNER JOIN #TempTable ON PriceBenchWeekly.YearNb = #TempTable.YearNb AND 
PriceBenchWeekly.WeekNb = #TempTable.WeekNb AND PriceBenchWeekly.ISOCountryCode = #TempTable.ISOCountryCode

GROUP BY PriceBenchweekly.YearNb, PriceBenchWeekly.ISOCountryCode, BNCode, MarketPlayerCode

【问题讨论】:

  • 我怀疑 case 语句影响了你的表现。打开显示计划运行查询,看看它告诉你什么(粘贴图像)
  • 哪一部分有问题?您正在处理多少条记录?

标签: sql sql-server


【解决方案1】:

该表格包含每个国家/地区的每周产品价格。我的目标是为每种产品在每个国家/地区的最近一周/年中选择每种产品的最低价格。

使用窗口函数。没有样本数据和期望的结果,很难弄清楚你真正想要什么。但以下是数据中最近一周的每种产品的最低价格:

select pbw.*
from (select pbw.*,
             min(weeklyprice) over (partition by prodnb) as min_weeklyprice
      from (select pbw.*,
                   dense_rank() over (order by year desc, weeknb desc) as seqnum
            from CE.PriceBenchWeekly pbw
           ) pbw
      where seqnum = 1
     ) pbw
where weeklyprice = min_weeklyprice;

【讨论】:

  • 感谢您的快速回答,这看起来很有趣我对 SQL 还是很陌生,所以我什至不知道这一点。我很抱歉在我的原始帖子中不够具体。这几乎可以满足我的要求,只是缺少国家/地区组件,这意味着我需要最近一周每个国家/地区的每种产品的最低价格。我会玩这个,也许我可以让它工作。再次感谢!
【解决方案2】:

如果您想使用临时表,请不要使用 select into 创建它,而是使用 CREATE TABLE #TempTable,然后您可以为年、周和国家代码创建非聚集索引...

无论如何,我更喜欢外部应用

SELECT DISTINCT A.ProductCode, A.CountryCode, B.YearNo, B.WeekNo, B.MinPrice
FROM YourTable A
OUTER APPLY (
    SELECT TOP 1 YearNo, WeekNo, Min(Price) AS MinPrice
    FROM YourTable 
    WHERE ProductCode = A.ProductCode AND CountryCode = B.CountryCode
    GROUP BY YearNo, WeekNo
    ORDER BY YearNo DESC, WeekNo DESC
) B

【讨论】:

  • 感谢您的建议,我会调查一下!我仍然需要更好地了解整个索引部分,从我能收集到的信息来看,这似乎非常强大。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多