3

SQLバックエンド(Postgresql)を使用したアプリケーションの設計に取り組んでいますが、設計に関するいくつかの質問があります。つまり、DBはその場で発生するネットワークイベントを保存する役割を果たします。そのため、これらのイベントに応じた「リアルタイム」アクションにより、挿入速度とパフォーマンスが重要になります。データはいくつかのテーブルで高速のデフォルト形式にダンプされます。現在、postgresqlトリガーを使用して、このデータをレポートに使用される他のいくつかのテーブルに配置しています。

通常のイベントでは、データはそれぞれ同じ主キー(イベントID)を共有する2つの異なるテーブルに挿入されます。次に、データを移動して、Webベースのレポートインターフェイスで使用されるいくつかの異なるテーブルに再配置する必要があります。私の主な目標/懸念は、最初の挿入テーブルの負荷を軽減して、彼らが自分のことを実行できるようにすることです。レポートは二次的なものですが、すでに処理されたイベントをクエリして管理する必要があるcronジョブとは対照的に、トリガーを介してオンザフライでこれを実行するのは良いことです。レポートは、最初の挿入テーブルに触れる必要があります。パフォーマンスに関して..これは理にかなっていますか、それとも私は完全にオフですか?

データが適切なレポートテーブルに配置されたら、挿入テーブルのデータを長時間保持する必要がないため、挿入パフォーマンスのために定期的にデータを整理しておきます。このシナリオについて考えるとき、これは半一般的であると確信していますが、次の3つのオプションを考え出しました。

  1. トリガーを使用して、最初の行の挿入時にトリガーし、レポートテーブルにデータを入力します。これが私の当初の計画でした。

  2. トリガーを使用して挿入データを一時テーブル(同じ形式)にコピーしてから、トリガーまたはcronを使用してレポートテーブルにデータを入力します。これは単なる考えでしたが、一時テーブルへの単純なコピー操作は、上記のソリューションのトリガーのクエリのいずれかをオフロードすると思います。

  3. 最初の出力プログラムを変更して、すべてのデータを1つのテーブルにダンプし(2つにまたがる場合と比較して)、その挿入をトリガーしてレポートテーブルにデータを入力します。したがって、ソリューション1がマルチテーブルからマルチテーブルのトリガーの状況である場合、これはシングルテーブルのソースからマルチテーブルのトリガーになります。

私はこれを考えすぎていますか?私はこれを正しくしたいと思います。どんな入力でも大歓迎です!

4

2 に答える 2

3

実行する「こと」が増えるため、パフォーマンスがわずかに向上する場合があります (操作にはまったく影響しませんが)。ただし、トリガー/その他の PL を使用することは、アプリケーションから DB サーバーに送信されるコードよりも高速に実行されるサブセを最小限に抑える良い方法です。

1)それが最もクリーンで最も効率的な方法だと思うので、私は あなたの最初のアイデアに行きます。2)cron は、サーバー側の機能を使用する他のソリューションよりも多くのクエリを実行するため、パフォーマンスを最も要求するソリューションです。3)可能ですが、「醜い」データベースレイアウトになります。

于 2010-09-13T07:53:23.313 に答える
0

これは古いものですが、ここに私の答えを追加します。

レポートは二次的なものですが、既に処理されたイベントを照会および管理する必要がある cron ジョブとは対照的に、これがトリガーを介してその場で発生することは依然として素晴らしいことです。レポートは、最初の挿入テーブルに触れる必要があります/決して触れることはありません。パフォーマンスに関して..これは理にかなっていますか、それとも完全にオフですか?

残念ながら、それはかなり外れているかもしれませんが、いくつかのケースではそうではないかもしれません. これは、レポートに対するキャッシュの影響によって異なります。ディスク I/O とメモリはあなたの必需品であり、ライターとリーダーが PostgreSQL でお互いをブロックすることはめったにないことに注意してください (明示的にロックを昇格させない限り --- たとえば、SELECT ... FOR UPDATE はライターをブロックします)。基本的に、テーブルが RAM に快適に収まる場合は、イベント エントリの WAL セグメント コミットのためにディスク I/O を解放しておくため、テーブルからレポートする方がよいでしょう。RAM に収まらない場合は、レポートによってキャッシュ ミスの問題が発生している可能性があります。ここで、ビューを具体化する (つまり、トリガー管理テーブルを作成する) と、これらが削減される可能性がありますが、かなりの複雑さのコストがかかります。これは、ところで、オプション1の場合。したがって、これを暫定的にチョークします時期尚早の最適化として。また、この方法でビューをマテリアライズすると、キャッシュ ミスやロックの競合が発生する可能性があるため、挿入に関するパフォーマンスの問題が発生する可能性があることに注意してください。

WAL コミットを除いて RAM から操作できる場合、パフォーマンスの問題は発生しないことに注意してください。

#2の場合。一時テーブルを CREATE TEMPORARY TABLE として意味する場合、パフォーマンスの問題や、表示したいものが表示されないレポートなど、混乱を招きます。やらないでください。これを行うと、次の可能性があります。

  1. 挿入ごとに (またはセッションごとに少なくとも 1 回) PostgreSQL にトリガーの再計画を強制します。ああ。
  2. テーブルの作成/削除のオーバーヘッドを追加する
  3. OID ラップアラウンドの可能性

等.....

要するに、あなたはそれを考えすぎていると思います。PgボックスのRAMを増やして、適切な数の挿入セッションとレポートセッションを処理するのに十分なコアがあることを確認することで、非常に遠くまで行くことができます. ハードウェアを正しく計画すれば、これは問題になりません。

于 2012-10-03T01:12:26.153 に答える