2015-02-09 110 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