質問
0.1秒ごとに収集されたレコードを含むデータベースがあり、特定の日から20分に1回までデータを平均する必要があります。したがって、平均24*3の値である20分ごとに1日分のデータを返す必要があります。
現在、1日以内に20分ごとにデータベースに別のAVGコールを行います。これは24*3コールです。データベースへの接続は少し遅いように見えます(リモートです)。すべての平均を行うには5分かかります。 1日分のデータにアクセスし、平均20分ごとに1回のクエリを実行する方が速いでしょうか?質問に答えるのに役立つ場合は、平均化する前にデータに対して算術を行う必要があります。つまり、いくつかのテーブル列に掛けられます。
解決
真夜中以降の数分数を次のように計算できます。
datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)
それを20で割ると、20分間隔の数が得られます。例えば、 00:10
間隔に落ちるでしょう 0
, 00:30
間隔 1
, 、 と 15:30
間隔 46
, 、 等々。この式を使用すると、次のような20分間隔でグループ化できます。
select
(datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)) / 20 as IntervalNr
, avg(value)
from YourTable
group by (datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)) / 20
内部で数学を行うことができます avg
電話してください:
avg(col1 * col2 - col3 / col4)
他のヒント
一般に、クエリの数を減らすことは良い考えです。クエリで可能な算術/フィルタリング/グループ化を何でも集計して実行し、サーバー側で「反復」計算(PHPの例など)を実行します。
それがより速くなるかどうかを確認するには、測定する必要があります。
ただし、データベースへの接続が遅いため、より速くなります。これにより、往復の数は、実行時間の合計に大きな影響を与えます。
データベースのストアドプロシージャはどうですか?データベースエンジンがサポートされていない場合、スクリプトを持っているか、数学を実行し、データベースサーバーに個別の「平均」テーブルを入力するのはどうでしょうか。その後、1日に1回だけのリモートクライアントからの平均を読む必要があります。
1つのクエリでの計算はやや高速になります。接続の設定、クエリの解析、ストアドプロシージャのロードなど、複数のリクエストでオーバーヘッドを考えてください。
また、ヒューのパフォーマンスが向上する可能性のある正確な指標を確認してください。 Hughデータベースの一部の操作は数分から数時間続く場合があります。
多くのデータを送信している場合、接続がボトルネックである場合、データをグループ化して送信する方法といつデータを送信するかは重要ではありません。 56Kモデムで10分ごとに100MBを送信する良い方法はありません。データのサイズと帯域幅を把握し、送信できることを確認してください。
そうは言った:
まず、ネットワークがボトルネックであることを確認してください。その場合は、可能であれば小さなデータセットを使用して、さまざまなシナリオをテストしてみてください。一般に、1つの大きなレコードセットでは、サイズの半分の2つのレコードセットよりも帯域幅が少なくなります。
可能であれば、テーブルに列を追加し、データベースにデータを投稿するたびに、列製品とインターバルインデックス(Andomarの投稿を参照)を計算して保存します。