0

概要

私はSQLサーバーと.netを使用して単純なデータを分析する最も簡単な方法についていくつかのアドバイスを求めています

詳細

本当に単純なデータ-分析するための本当に単純な方法が必要です(私の単純な脳で)

SQLServerテーブルがあります。

  • PKID(Int)
  • ApplicationName(VarChar)
  • MethodName(VarChar)
  • TimeInMs(整数)
  • AdditionalInfo(VarChar)
  • DateTime(DateTime)

このテーブルには、さまざまなアプリケーションでさまざまなメソッドを実行するのにかかった時間が記録されています。このテーブルには、数万行が含まれる可能性があります。これから有用な情報を簡単に抽出したいと思います(その一部はリアルタイムで)。私はこれについて行くための最良の方法がわかりません。私が欲しいこの種のデータは次のとおりです。

データ-メソッド呼び出しの平均時間-最も遅いメソッド呼び出しのトップ10-最も速いメソッド呼び出しのトップ10

次の期間の場合:-最後の分、時間、日、週、月-過去7日間は毎日、過去10週間は毎週

アプリケーションの場合:-すべて-それぞれ個別に

4

2 に答える 2

1

タイムスタンプ情報を追加しないと、意味のある分析を行うことができません。せいぜい、アプリケーションのパフォーマンスに関する要約統計量へのクエリを作成できます。

select count(*) from table_name where ApplicationName = "BAR.EXE";

select sum(TimeInMs) from table_name group by ApplicationName;

それらの数を分割するコードを書く以外に、あなたはあまりすることができません。

更新:タイムスタンプ情報を使用して、上記のサンプルのwhere句を調整して、関心のある範囲を選択できます。質問の性質が不正確であるため、データをExcelにインポートして(Excelをインストールしていません)マッサージすることをお勧めします。 SQLを直接操作するのではなく、さまざまな方法でデータを処理します。

于 2009-04-25T20:17:53.183 に答える
0

ojblassは、質問から省略したDataTimeフィールドを参照していたと思います。

MS SQL Serverの実際のタイムスタンプデータ型は、名前が誤解を招く可能性があります。日時とは関係ありません。バイナリの「バージョン番号」です。これは主に、テーブルの行を更新する際の同時実行の問題を処理するために使用されますが、分析タスクには役に立ちません。

列名を少し改善することをお勧めします。列を「DateTime」と呼ぶと混乱を招き、注意しないとクエリの記述に問題が発生する可能性があります。

とにかく...TSQLで直接記述した場合、探しているクエリは単純なものから非常に複雑なものまでさまざまです。

ここにいくつかの例があります(私はこれらを構文チェックしていないので、せいぜい「おおよそ」です):

特定のメソッドの平均時間

select avg(TimeInMs) as AvgTime from Table 
where ApplicaitonName = @ApplicationName

過去1分間の特定のメソッドの平均時間

select avg(TimeInMs) as AvgTime from Table 
where ApplicaitonName = @ApplicationName and 
    [DateTime] >= DATEADD(minute, -1, getdate())

これらのほとんどのストアドプロシージャを作成することになります。あなたが話しているクエリのいくつかは、いくつかのグループ化なども必要とします...このルートに行く場合は、TSQLに関する本を入手することをお勧めします。

アプリケーション内でLINQtoSQLを使用してこれを行っている場合、それほど違いはありませんが、一般的にLINQの方が記述が簡単です(もちろん議論の余地があります)。

これは、C#でLINQ to SQLを使用した同じ2つのクエリです(ここでも、これらをテストしていないため、構文エラーが発生する可能性があります)。

var ctx = new MyDataContext();
var q = (from item in ctx.Table
        where item.ApplicationName == "MyApplication"
        select item.TimeInMs).Average();


var ctx = new MyDataContext();
var q = (from item in ctx.Table
        where item.ApplicationName == "MyApplication" &&
              item.DateTime <= DateTime.Now.AddMinutes(-1)
        select new item.TimeInMs).Average();

分析をどのように行うかは、使用しているテクノロジーと結果で何をしているかによって異なります。

更新: コメントからのフォローアップ質問への回答:

非常に難しくならない別のテーブル(カーソルとExectureコマンドを介して動的に構築されたTSQL)に目的の時間間隔を格納することで、それを処理する良い方法を考えることはできません。

必要な結果を取得する単純なクエリは、TSQLでは次のようになります(これが「最良の」方法であるとは主張していませんが、機能し、かなり高速です)。

select avg(TimeInMs) as AvgTime, 'Last 1 minute' as TimePeriod from Table 
where ApplicaitonName = @ApplicationName and 
    [DateTime] >= DATEADD(minute, -1, getdate())
union
select avg(TimeInMs) as AvgTime, 'Last 2 minutes' as TimePeriod from Table 
where ApplicaitonName = @ApplicationName and 
    [DateTime] >= DATEADD(minute, -2, getdate())
-- //repeat union as many times as needed for each time period
于 2009-04-25T21:28:09.957 に答える