2015-02-09 109 views
0

我正在SQL Server上基于视图运行查询。这个视图的主要数据源是一个包含近5000万行数据的表格。几个星期以来,我一直在运行查询,并在大约20分钟内完成。我试过最近运行它,它是无法使用的。生产第一批1,000行产品需要超过2.5小时的时间。SQL查询突然放慢到抓取

下面是查询中的代码。我注意到的是,当我删除'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

你能发布执行计划吗?桌上有没有索引? – Thilo 2015-02-09 15:07:19

+0

查询计划是否告诉您任何有用的信息,例如任何建议的索引? – 2015-02-09 15:08:01

+2

你的一年真的是一个字符?也许有转换发生导致问题。 – 2015-02-09 15:09:02

回答

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