SQL查询突然慢慢爬行

时间:2015-02-09 15:06:09

标签: sql sql-server

我正在基于视图在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

2 个答案:

答案 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