2016-07-29 5 views
1

もっと速くするために、次のクエリを書き直す際に助けが必要です。結局のところ、私が望むのは、対応するメトリックを持つサーバー(キャプション)ごとに1行です。 MaxとAvgを削除すると、サーバーあたり1600行が得られ、3秒で実行されます。それらを追加すると、1台のサーバーのデータを計算するのに約3分かかります。サーバーの総数は11,000以上です。これをもっと速くするための助けが必要

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

関連する問題