1

多くの異なるテーブルとそれらのテーブルのフィールドの状態に基づいて更新されるデータベース テーブルの 1 つにキャッシュされたフィールドがあります。

これらの各テーブルは、トリガーを介して同じ関数を呼び出します: updateCachedField(basetable_id INTEGER)。updateCachedField 関数は、これらの他のすべてのテーブルに対してクエリを実行し、ベース テーブルの新しいキャッシュ値を計算します。updateCachedField 関数は複雑で、非常にコストがかかります。

単一のトランザクション中に、キャッシュされたフィールドに影響を与える多くのテーブルが変更される可能性があります。そのため、1 つのトランザクション中に updateCachedField 関数が 50 回呼び出される可能性がありますが、異なる basetable_id は 5 つだけです。

これを最適化して updateCachedField 関数が 50 回以上ではなく 5 回しか呼び出されないようにする方法はありますか?

4

1 に答える 1

0

xmin値またはその他の情報に基づいて、延期可能な制約トリガーとクエリを使用するのが最善の方法だと思います。実際、スナップショット用の「ログ」データを別の場所にコピーすることもできます。

明確な情報がなければ、何を見ているのか明確ではありませんが、1 つのオプションは、基本的に 3 セットのテーブルを用意することです。

  1. ライブテーブル。更新 (デルタまたはその他の集計に役立つ情報) は、更新または挿入時にログ テーブルに書き込まれます。

  2. ログ テーブル。これらは追加のみです。

  3. ログ テーブルの新しいセットを定期的に集約するスナップショット テーブルを集約します。

その後、最後のスナップショットからのみ集計して、現在の集計データを表示するライブ ビューを作成できます。

于 2013-04-27T02:28:09.887 に答える