2014-01-27 71 views
0

我有下面的Access查詢,它工作正常。然而,現在大約需要8-10秒才能完成大約700條記錄。 FROM是查詢時間很少的另一個查詢。我已經縮小到MAX()函數,因爲當我刪除該函數時,它運行的查詢時間很少。我能做些什麼來加快速度?我將假設隨着更多數據進入數據庫,查詢需要的時間越長。訪問查詢MAX()減緩查詢

SELECT FirstName, LastName, TeamID, MAX(total) AS totalMax 
     FROM attendanceViewAll 
      WHERE TeamID IN(5,9,13) 
      GROUP BY FirstName, LastName, TeamID 

這裏是子查詢,基本上它從表中選擇一堆數據。這發生在不到一秒鐘的時間。此查詢的結果是按日期排序的所有內容,並且agentID。然後,我使用上述查詢來查找MAX(total),以便我可以將代理分組以進行彙總。我也使用下面的查詢來獲取其他報告。

SELECT 
    a1.TeamID, 
    a1.FirstName, 
    a1.LastName, 
    a1.incurredDate, 
    a1.points, 
    a1.OneFallOff, 
    a1.TwoFallOff, 

    (select sum(a2.actualPoints) 
     from attendanceView as a2 where a2.agentID = a1.agentID and a2.incurredDate <= a1.incurredDate) as total, 

a1.comment, a1.linked, a1.FallOffDate 
FROM attendanceView as a1; 
+0

你如何組裝你的'attendanceViewAll'視圖? – Brad

+0

不知道子查詢是什麼,建議優化策略是沒有意義的。 –

+0

我用另一個查詢編輯過。 –

回答

2

你的[attendanceViewAll]查詢使用一個相關子查詢的索引產生一個運行總數(參考:您的上一個問題here)。現在您要求輸入總計的MAX(),這與[TwoFallOff]值的SUM()相同。也就是說,對於

incurredDate TwoFallOff total 
------------ ---------- ----- 
    2014-01-10   2  2 
    2014-01-11   3  5 
    2014-01-12   1  6 

MAX(總)與SUM(TwoFallOff)的值相同。最大的區別是,爲了獲得[總數]的每個值,您需要運行相關的子查詢,而爲[TwoFallOff]獲取每個值則不需要。

換句話說,我懷疑你當前的查詢很慢,因爲MAX()強制執行[attendanceViewAll]中的相關子查詢很多次。如果您將當前查詢直接返回[attendanceView]和SUM()從那裏的[TwoFallOff]值,您可能會得到更快的響應。

0

你需要的是多列索引,它應該幾乎是瞬時的。

Use the interface因爲此鏈接描述您是否需要幫助。然而,索引應該是第一上的標準,次要對在組中使用的字段,因此我會對

TeamID,名字,姓氏

+0

我已經有我的表包含代理名稱索引的方式。我確實沒有運氣改變組的順序,仍然是8-10秒。 –