我正在基于视图在SQL Server上运行查询。该视图的主要数据源是一个包含近5000万行数据的表。几个星期以来,我一直在运行有问题的查询,它已经在大约20分钟内完成了。我最近尝试运行它,它无法使用。生成前1000行输出只需2.5小时以上。
以下是查询中的代码。我注意到的是,当我删除'where'和'having'语句以及'sum'时,查询会再次快速运行。显然,这不是解决方案。
select YEAR, BUSINESS_GROUP, STATE, PRODUCT, sum(AGE_01_REVENUE) REVENUE
from dbo.VW_PRODUCTS
where YEAR='2015'
group by YEAR, BUSINESS_GROUP, STATE, PRODUCT
having sum(AGE_01_REVENUE) <> 0
答案 0 :(得分:1)
如果没有执行计划和索引,很难提供一个好的答案。
您可以尝试使用临时表将查询分解为多个步骤,以便在较小的数据集上完成聚合,如下所示。
首先创建一个包含2015
条记录的临时表:
SELECT YEAR, BUSINESS_GROUP, STATE, PRODUCT, AGE_01_REVENUE
INTO #TEMP_WORKING_TABLE
FROM dbo.VW_PRODUCTS
WHERE YEAR='2015'
接下来,在这组缩减的行上执行聚合:
SELECT YEAR, BUSINESS_GROUP, STATE, PRODUCT, SUM(AGE_01_REVENUE) REVENUE
FROM #TEMP_WORKING_TABLE
GROUP BY YEAR, BUSINESS_GROUP, STATE, PRODUCT
HAVING SUM(AGE_01_REVENUE) > 0
DROP TABLE #TEMP_WORKING_TABLE
答案 1 :(得分:0)
当事情突然变慢时要注意的一件事是过时的统计数据。
我想知道这个查询是否会更快,因为您只需要从较小的数据集中计算总和。
select YEAR, BUSINESS_GROUP, STATE, PRODUCT, sum(AGE_01_REVENUE) REVENUE
From
(select YEAR, BUSINESS_GROUP, STATE, PRODUCT, AGE_01_REVENUE
from dbo.VW_PRODUCTS
where YEAR='2015')a
group by YEAR, BUSINESS_GROUP, STATE, PRODUCT
having sum(AGE_01_REVENUE) <> 0