2009-03-17 2 views
1

환경의 모든 서버에 대해 수집 된 많은 양의 Windows perfmon 데이터가 포함 된 MSSQL 2000 데이터베이스로 작업하고 있습니다. SSRS 2005를 사용하여 시간 경과에 따라 메트릭을 시각화하기 위해 사용자 지정 보고서 차트를 작성합니다.행을 집계하여 SQL 쿼리의 데이터 분석을 줄이는 방법은 무엇입니까?

마지막 달에 많은 수의 데이터 요소가 X 축에 읽을 수없는 레이블이있는 못생긴 보고서를 작성한다고보고 싶습니다. 데이터를 합계 시간을 기준으로 n 데이터 포인트로 축소하여 그룹화 된 시간 범위의 평균값을 제공하고 싶습니다.

멋진 GROUP BY 절을 사용하여 쿼리를 작성했지만 실행하는 항목을 빌드하지 못했습니다. 나는 이것이 SQL을위한 공통적 인 작업이되어야한다고 생각했지만, 온라인에서 어떤 대답도 찾지 못했습니다.

기본적으로 테이블 구조는 다음과 같습니다. 실제로 MOM 2005 OnePoint 데이터베이스이지만 응용 프로그램과 관련이없는 것 같습니다.

CREATE TABLE PerfTable (
    [time] datetime, 
    value float, 
    Server nvarchar(356), 
    ObjectName nvarchar(225), 
    CounterName nvarchar(225), 
    InstanceName nvarchar(225), 
    Scale float 
); 
+0

특정 시간 간격으로 그룹화하려고합니까? –

+0

임의의 시간 간격. 차트의 20 개 데이터 포인트가 이상적이라고 판단 할 수 있으므로 X 데이터 포인트를 20 개로 줄일 수 있습니다. – spoulson

답변

0

정말 SQL에서 반환되는 레코드 수를 줄이거 나 차트에서 렌더링 한 데이터 만 줄여야합니까?

SQL에서 모든 값을 얻는 것이 더 쉬울 수도 있고 나중에 데이터를 더 유용한 것으로 마사지 할 수도 있습니다. 질의를 변경하면 네트워크 사용량이 줄어들지 만 데이터가 전송되지는 않습니다. 그렇다고해도 문제가되지 않는다면 쿼리를 수행하는 것이 가장 좋은 방법이 아닙니다.

1

개월의 가치가있는 데이터를 살펴보고 그 뒤에있는 SQL을 사용하여 데이터 양을 줄이려면보기를 작성할 가치가 있습니다.

그런 다음 해당보기에서 보고서를 실행할 수 있습니다.

또한 결과를 얻기 위해 현재 사용중인 SQL과 관련된 테이블 구조에 대한 아이디어를 제공하는 것이 좋습니다.

0

DATEPART 함수를 사용하여 특정 날짜, 시간 또는 분 (또는 여러 다른 항목)별로 필터링 된 데이터 청크를 얻을 수 있습니다. 이들을 기준으로 그룹화하고 필요한 평균/합계를 얻을 수 있어야합니다.

OK, 여기 (데이터가 시간의 각 청크에 거기로까지) N 집계를 얻을 수있는 솔루션입니다 :

declare @points as int 
declare @start as float 
declare @period as float 

set @points = 20 

select 
@start=cast(min(time) as float), 
@period=cast(max(time)-min(time) as float) 
from perftable 

select avg(value), 
round((cast(time as float)[email protected])/(@period/@points),0,1) 
from perftable 
group by 
round((cast(time as float)[email protected])/(@period/@points),0,1) 

@points 변수는 숫자 OD 당신이 얻고 싶은 집계입니다. [] @points 0] 절단 결과 @start 보고서에서 처음 기록 시간 @period 나머지는 범위 날짜 거의 선형 스케일링이

시작 보고서 종료일 간의 차이 부유 캐스트 인 잘린 결과로 정수 및 그룹화를 수행합니다.

+0

그 작업을 수행 할 수 있었지만 수행하고 싶은 작업은 * n 개 이하로 집계하는 것입니다. * 데이터 점수. 보고서를 생성하는 사용자는 사용 가능한 보고서 차트를 얻기 위해 집약 간격을 고치려하지 않습니다. – spoulson

0

우리는 3 배의 평균 및 해당 기간의 "가치"를 원한다고 가정 해보십시오.

처음으로 우리는 마침표를 결정합니다. 시작 - 끝, 시작 - 끝, 시작 - 끝 등 매개 변수를 사용하기 위해 코드에서 직접 할 수 있습니다.

이 예제에서는 'server'로 그룹화하지만 추가 열을 추가하거나 제거 할 수 있습니다.

DECLARE @startdate1 as DateTime 
DECLARE @enddate1 as DateTime 
DECLARE @startdate2 as DateTime 
DECLARE @enddate2 as DateTime 
DECLARE @startdate3 as DateTime 
DECLARE @enddate3 as DateTime 
SELECT 
    CASE WHEN time >= @startdate1 AND time < @enddate1 THEN 'PERIOD1' 
    ELSE CASE WHEN time >= @startdate2 AND time < @enddate2 THEN 'PERIOD2' 
    ELSE CASE WHEN time >= @startdate3 AND time < @enddate3 THEN 'PERIOD3' 
    END 
    END 
    END as Period, 
    AVG(p.[value]), 
    p.[Server] 
FROM PerfTable p 
GROUP BY 
    CASE WHEN time >= @startdate1 AND time < @enddate1 THEN 'PERIOD1' 
    ELSE CASE WHEN time >= @startdate2 AND time < @enddate2 THEN 'PERIOD2' 
    ELSE CASE WHEN time >= @startdate3 AND time < @enddate3 THEN 'PERIOD3' 
    END 
    END 
    END, 
    p.[Server] 
0

저는 제가 궁금해하는 것과 밀접하게 관련된 해결책을 가지고 있습니다.나는 시간 단위로 그룹 원한다면, 그것은 매우 간단합니다

그룹 시간 기준 :

select 
    dateadd(hh, datediff(hh, '1970-01-01', [time]), '1970-01-01'), 
    Server, ObjectName, CounterName, InstanceName, avg(value) 
from PerfTable 
group by 
    dateadd(hh, datediff(hh, '1970-01-01', [time]), '1970-01-01'), 
    ComputerName, ObjectName, CounterName, InstanceName 
order by 
    dateadd(hh, datediff(hh, '1970-01-01', [time]), '1970-01-01') desc, 
    ObjectName, CounterName, InstanceName, ComputerName 

이것은 단지 N 데이터 포인트까지 확장 할 수있는 요구를 충족하지 않습니다.

관련 문제