計算の複雑さとストレージ サイズをトレードオフしています。テーブルに列を追加すると、テーブルのサイズと、テーブル全体を読み取るために必要な I/O の量が増加します。
通常、フル テーブル スキャンを必要とするクエリを実行している場合、データ サイズの増加が問題になります。
一方、事前計算された値をテーブルに格納することには、いくつかの利点があります。
- 計算は行ごとに 1 回だけ行われます。したがって、それらを何度も取得している場合は、節約できます。
- 計算された列 (任意のデータベース内) にインデックスを付けて、クエリをより効率的にすることができます。
- クエリが「干し草の山の中の針」クエリ (つまり、一度に数行をフェッチするだけ) である場合、パフォーマンスへの影響はありません。
事前計算の最大の問題は、計算された値を維持することです。典型的なアプローチは、「before update」および「before insert」トリガーを使用して計算を行うことです。または、すべての挿入と更新をストアド プロシージャでラップし、そこにそのようなビジネス ロジックを配置することもできます (これは私が普段行っていることです)。
ストアド プロシージャとトリガーの間のパフォーマンスの違いは、ほとんどの状況でまったく無視できるはずです。高スループット環境でパフォーマンスを最適化しようとしている場合は、dba.stackoverflow.com でこの質問をして、問題の性質、データベース、およびハードウェアについてより詳細に説明する必要があります。