0

たとえば、CALCULATEフィールドval1val2、を含むテーブルがありますval3

ここで、データの保存/取得には 2 つのオプションがあります。

  1. addition multiplication列を追加 divisionし、計算されたデータを保存しますINSERT

  2. 最初にデータを保存してから、選択時に計算された値を返します。

また、オプション 1 については、プロシージャまたはトリガーを使用する方が効率的ですか?

これは非常に単純な例です。私が見つけようとしているのは、より複雑な数式とより多くのデータを使用して、より大きな規模で行われていることです。どの方法がより効率的でしょうか?

4

2 に答える 2

1

計算の複雑さとストレージ サイズをトレードオフしています。テーブルに列を追加すると、テーブルのサイズと、テーブル全体を読み取るために必要な I/O の量が増加します。

通常、フル テーブル スキャンを必要とするクエリを実行している場合、データ サイズの増加が問題になります。

一方、事前計算された値をテーブルに格納することには、いくつかの利点があります。

  1. 計算は行ごとに 1 回だけ行われます。したがって、それらを何度も取得している場合は、節約できます。
  2. 計算された列 (任意のデータベース内) にインデックスを付けて、クエリをより効率的にすることができます。
  3. クエリが「干し草の山の中の針」クエリ (つまり、一度に数行をフェッチするだけ) である場合、パフォーマンスへの影響はありません。

事前計算の最大の問題は、計算された値を維持することです。典型的なアプローチは、「before update」および「before insert」トリガーを使用して計算を行うことです。または、すべての挿入と更新をストアド プロシージャでラップし、そこにそのようなビジネス ロジックを配置することもできます (これは私が普段行っていることです)。

ストアド プロシージャとトリガーの間のパフォーマンスの違いは、ほとんどの状況でまったく無視できるはずです。高スループット環境でパフォーマンスを最適化しようとしている場合は、dba.stackoverflow.com でこの質問をして、問題の性質、データベース、およびハードウェアについてより詳細に説明する必要があります。

于 2013-05-29T20:41:12.573 に答える
0

DB サイズが十分に大きい場合は、オプション 2 が有効です。論理的には、挿入クエリよりも多くの選択クエリをテーブルで実行します。

于 2013-05-29T20:37:18.223 に答える