2

毎秒情報を送信する複数のデバイス (具体的には 11 個) があります。この情報は、Apache サーバーで受信され、PHP スクリプトによって解析され、データベースに格納され、最終的に GUI に表示されます。私が今行っているのは、現在の日の行が存在するかどうかを確認することです。存在しない場合は新しい行を作成し、そうでない場合は更新します。私がそうする理由は、データベースから情報をポーリングし、それを C++ アプリケーションで表示して、リアルタイムのように見せる必要があるからです。デバイスが情報を送信するたびに行を作成すると、データの処理と読み取りにかなりの時間がかかるだけでなく、システム リソース (メモリ、CPU など) もかかり、データの表示が現実的ではなくなります。時間。毎日 (00:00:00 から 23:59 まで:

私の質問は基本的に次のとおりです。

  • データベースサーバーで直接挿入/更新部分を実行することは可能ですか、それともphpスクリプトでロジックを実行する必要がありますか?

  • ディスプレイ デバイスのパフォーマンスを低下させずに情報を保存するためのより良い (より効率的な) 方法はありますか?

  • レポートの生成に関して、昨日の 15:50:00 から今日の 12:45:00 までという間隔でサンプリングしたい場合、現在のデータ構造では実行できないため、順番に何を考慮する必要がありますか?そのようなクエリを作成できるデータ構造を作成します。

私が使用するコンポーネント: - Apache 2.4.4 - PostgreSQL 9.2.3-2 - PHP 5.4.13

4

3 に答える 3

1

1) この手法は upsert と呼ばれます。PG 9.1+ では、wCTE ( http://www.depesz.com/2011/03/16/waiting-for-9-1-writable-cte/ )で実行できます。

2)本当にリアルタイムにしたい場合は、データをアプリケーションに直接送信する必要があります。最後のいくつかの値のみを気にする場合は、データをメモリまたはプレーンテキスト ファイルに保存する方が高速です。しかし、PG にはリッスン/通知チャネルがあるため、おそらくラグはわずか 100 ~ 200 ミリであり、それを表示するだけでそれほど気にする必要はありません。

于 2013-05-21T20:37:43.857 に答える
1

私の推奨事項 - デバイスが送信するすべての情報を保存するだけです。適切なインデックスとクエリを使用すると、DB からの情報を非常に高速に処理および取得できます。

ご質問について:

はい、SQL、PL/pgSQL、PL/PHP、PL/Java、PL/Py、および Postgres に組み込まれている他の多くの言語を使用して、Postgres DB 内で任意のロジックを構築できます。

前に言ったように、適切なインデックス作成は魔法のようです。

テーブル全体で目的のクエリ速度が得られない場合は、デバイスごとに 1 行の小さなテーブルを作成できます。そして、このテーブルに最後の既知の値を保持して、それらを に表示しますsort of real-time

于 2013-05-21T20:28:23.067 に答える
0

あなたが説明したプロセスを考えると、メモリシステム要件を過大評価していると思います。毎秒 (または毎秒 11) データ行を追加することは、リソースを独り占めすることではありません。実際、UPDATE と新しい行の ADD のほうが時間がかかる可能性があります。また、テーブルに TIMESTAMP を追加すると、並べ替え操作が非常に高速になります。ガベージ コレクションの処理を CRON ジョブ (古いデータの削除) として 1 日 1 回程度追加するだけで十分です。

ただし、質問に答えるには:

挿入/更新部分をデータベース サーバーで直接実行することは可能ですか?それとも、php スクリプトでロジックを実行する必要がありますか?

通常、データベース エンジンを使用してロジックを記述することは、それほど簡単ではありません。シンプルにするために、php スクリプトのロジックに固執します。UPDATE (または) INSERT INTO table SET var1='assignment1', var2='assignment2' (WHERE id = 'checkedID')

ディスプレイ デバイスのパフォーマンスを低下させずに情報を保存するためのより良い (より効率的な) 方法はありますか?

ディスプレイ デバイスの接続について説明していないため、回答するのは困難です。プロセスをより効率的に行う方法はありますが、このような頻繁な更新に必要なロック機構を備えた方法はありません。

レポートの生成に関して、昨日の 15:50:00 から開始し、今日の 12:45:00 に終了する間隔をサンプリングしたい場合、現在のデータ構造では実行できません。 >そのようなクエリを作成できるデータ構造を作成するためです。

TIMESTAMP 変数タイプを使用できます。これには、UPDATE 操作の DATE と TIME が含まれます。次に、データベース クエリ内で DATE 関数を使用する単純な WHERE 句です。

于 2013-05-21T20:28:16.203 に答える