2016-07-29 157 views
1

我需要幫助重新編寫以下查詢以使其更快。最終,我想要的是每個服務器的一行(標題)和相應的指標。如果我刪除最大和Avgs,我得到每臺服務器1600行,並在3秒內運行。如果我添加它們,計算單個服務器的數據大約需要3分鐘。服務器總數超過11K。需要幫助才能使得這個速度更快

SELECT   
    Nodes.Caption, COUNT(DISTINCT CPUMultiLoad_Detail.CPUIndex) AS CPUCount, 
    Max(CPULoad.MaxLoad) as MaxCPU, Avg(CPULoad.AvgLoad) as AvgCPU, 
    Round((CPULoad.TotalMemory/1073741824),0) as MemCount, 
    Round(Max(CPULoad.MaxMemoryUsed/CPULoad.TotalMemory * 100),2) as MaxMem, 
    Round(Avg(CPULoad.AvgPercentMemoryUsed),2) as AvgMem 
FROM 
    Nodes 
INNER JOIN 
    CPUMultiLoad_Detail ON Nodes.NodeID = CPUMultiLoad_Detail.NodeID 
INNER JOIN 
    CPULoad ON Nodes.NodeID = CPULoad.NodeID 
WHERE CPULoad.Datetime >= DATEADD(month,datediff(month,0,getdate())-1,0) 
     and CPULoad.Datetime < DATEADD(day,datediff(day,0,getdate()),1) 
GROUP BY Nodes.Caption, CPULoad.TotalMemory 
+5

顯示錶的佈局和索引和PK,你是否被允許添加/修改現有的索引 – objectNotFound

+4

你能不能也發佈實際執行計劃? –

+0

你打算在cpuLoad.totalMemory周圍有一個聚合函數(SUM?)嗎? – Beth

回答

0

不知道這是否會幫助,沒有數據來進行測試,但你可以嘗試推下你的聚合函數需要它們的地方,然後將結果格式化:

SELECT  
    n.nodeid, 
    Caption, 
    count_cpuIndex AS CPUCount, 
    max_maxLoad AS MaxCPU, 
    avg_avgLoad AS AvgCPU, 
    ROUND((TotalMemory/1073741824),0) AS MemCount, 
    ROUND(max_maxMemoryUsedPct * 100, 2) AS MaxMem, 
    ROUND(avg_avgPercentMemoryUsed, 2) AS AvgMem 
FROM 
    (SELECT 
     caption, 
     nodeid 
    FROM 
     Nodes) n INNER JOIN 
    (SELECT 
     nodeid, 
     COUNT(DISTINCT CPUIndex) AS count_cpuIndex 
    FROM 
     CPUMultiLoad_Detail 
    GROUP BY 
    nodeid) d ON 
    n.NodeID = d.NodeID INNER JOIN 
    (SELECT 
     nodeid, 
     TotalMemory, 
     MAX(MaxLoad) AS max_maxLoad, 
     AVG(AvgLoad) AS avg_avgLoad, 
     MAX(MaxMemoryUsed/TotalMemory) AS max_maxMemoryUsedPct, 
     AVG(AvgPercentMemoryUsed) AS avg_avgPercentMemoryUsed 
    FROM 
     CPULoad 
    WHERE 
     Datetime >= DATEADD(MONTH,datediff(MONTH,0,getdate())-1,0)  AND 
     Datetime < DATEADD(DAY,datediff(DAY,0,getdate()),1) 
    GROUP BY 
    nodeid, 
    TotalMemory) l ON 
    n.NodeID = l.NodeID 

此方法執行的另一件事是幫助您確定問題出在哪裏,因爲您可以分別運行每個子查詢,而無需單獨運行連接。

HTH

+0

你我的朋友是天才。整個查詢在12秒內運行,拉回所有11.5K行數據。 – mprobus