2009-03-17 8 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

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はあなたが取得したい集約です。 @periodをfloatにキャストレポート内の最初のレコードの時間が報告

で開始と終了の日付の差ですが、残りの範囲にする日付のかなりの線形スケーリングである @start [0; @points]、結果を切り捨てます整数に変換し、切り捨てられた結果でグループ化します。

+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個データポイントに縮小する必要性に対処していません。

関連する問題