1

システムを介して送信されるメッセージを格納する次のようなテーブルがあります。

Message
-------
ID (bigint)
CreateDate (datetime)
Data (varchar(255))

ピーク負荷時に1秒あたりに保存されるメッセージを計算するように求められました。私が実際に処理しなければならない唯一のデータはCreateDateです。システムの負荷は一定ではなく、大量のトラフィックが発生する場合と、トラフィックが少ない場合があります。この問題には2つの部分があると思います。1。ピーク負荷と見なされる時間の範囲を決定します。2。これらの時間中の1秒あたりの平均メッセージを計算します。

これは正しいアプローチですか?これに役立つSQLの機能はありますか?ヒントをいただければ幸いです。

4

3 に答える 3

2

同意します。レポートの作成を開始する前に、最初にピーク負荷を把握する必要があります。

最初に行うことは、ピーク負荷をどのように定義するかを理解することです。元。1 時間ごとの内訳を見ていきますか。

次に、秒単位 (ミリ秒単位ではない) でフォーマットされた CreateDate でグループ化を行います。group by の一部として、レコード数に基づいて平均を計算します。

于 2009-05-19T17:56:36.757 に答える
1

警告、これらは遅くなります!

これにより、データが「2 番目の」バケットにグループ化され、アクティビティの多いものから順にリストされます。

SELECT
    CONVERT(char(19),CreateDate,120) AS CreateDateBucket,COUNT(*) AS CountOf
    FROM Message
    GROUP BY CONVERT(Char(19),CreateDate,120)
    ORDER BY 2 Desc

これにより、データが「分」のバケットにグループ化され、アクティビティが最も多いものから順にリストされます。

SELECT
    LEFT(CONVERT(char(19),CreateDate,120),16) AS CreateDateBucket,COUNT(*) AS CountOf
    FROM Message
    GROUP BY LEFT(CONVERT(char(19),CreateDate,120),16)
    ORDER BY 2 Desc

私はそれらの値を取り、彼らが望むものを計算します

于 2009-05-19T19:10:12.513 に答える
1

ピーク時間を知る必要はないと思います。完全なクエリをラップし、上位 20 のエントリを選択して、SQL でそれらを生成できます。次に例を示します。

select top 20 *
from (
     [...load query here...]
) qry
order by LoadPerSecond desc

この回答には、平均についての良い教訓がありました。1 時間あたりの負荷を調べて 3600 で割ることで、1 秒あたりの負荷を計算できます。

先週の負荷を最初に垣間見るには、(Sql Server 構文) を試すことができます。

select datepart(dy,createdate) as DayOfYear,
       hour(createdate) as Hour, 
       count(*)/3600.0 as LoadPerSecond
from message
where CreateDate > dateadd(week,-7,getdate())
group by datepart(dy,createdate), hour(createdate)

1 分あたりのピーク負荷を見つけるには、次のようにします。

select max(MessagesPerMinute)
from (
  select count(*) as MessagesPerMinute
  from message
  where CreateDate > dateadd(days,-7,getdate())
  group by datepart(dy,createdate),hour(createdate),minute(createdate)
)

datepart(dy,...) によるグループ化は、月の境界を気にせずに日を区別する簡単な方法です。1 年以上前に選択するまでは機能しますが、これはパフォーマンス クエリでは珍しいことです。

于 2009-05-19T21:24:33.817 に答える