2

ページの読み込み時間を収集し、SQL テーブルに保存しています。毎分、これらの統計を「ロールアップ」して、ヒット数、平均読み込み時間、読み込み時間の標準偏差を保存したいと考えています。

しばらくして、合計ヒット数、平均ページ読み込み時間、および「プールされた」標準偏差を維持しながら、これらの 10 分間隔を 1 時間ごとに「ロールアップ」したいと考えています。

以下は、私が作成したテスト スクリプトの重要な部分です。

select
-- Pooled standard deviation
case when sum(NumHits) = 1
then null -- stddev is undefined when sample size = 1
else
    sqrt(
        (
            sum(
                (NumHits - 1) * square(StdDev) + NumHits * square(cast(AvgLoadTime as int))
            ) - 
            sum(NumHits) * square(sum(cast(NumHits as int) * AvgLoadTime) / sum(NumHits))
        ) / -- numerator
        (
            sum(NumHits) - 1
        ) -- denominator
    ) 
end 'StdDev'

テスト スクリプト全体の SQL Fiddle も表示されます。

プールされた標準偏差の計算は、ウィキペディアの次の式に基づいています。

プールされた標準偏差方程式

私の質問は次のとおりです。

  1. SQLでプールされた標準偏差を計算する最良の方法は何ですか?
  2. それはパフォーマンスを殺しますか?

アップデート:

caseすべてのサンプル サイズの合計 = 1 の場合を処理するステートメントを追加しました。その場合、標準偏差は未定義です。

4

0 に答える 0