2016-07-29 2 views
1

빨리 만들기 위해 다음 쿼리를 다시 작성하는 데 도움이 필요합니다. 궁극적으로, 내가 원하는 것은 대응 메트릭을 가진 서버 당 한 줄 (캡션)입니다. Max와 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

관련 문제