web-dev-qa-db-ja.com

累計:保存または計算

次の列を持つproductテーブルがあるとします。

product
--------
product_id
name

そして、各製品のトランザクション(IN/OUT)を記録する別のテーブルがあります。

product_transaction
--------------------
transaction_id
transaction_date
product_id
type
quantity

そのproductsと現在の数量を含む詳細を一覧表示するページが欲しいのですが。同時に、1日(または日付の範囲)内のすべてのトランザクションを一覧表示するページも必要です。このページには、現在のトランザクションの実行中の合計も含まれています。

私の質問は、現在の合計をproduct_transactionテーブルとproductテーブルの現在の数量。それとも、それらをその場で計算するだけの速さですか?

3
Felix Pamittan

多くのことと同様に、この質問への答えは「依存する」です。この場合、それが依存するのは、各製品が取得するトランザクションの数です。

トランザクションの量が少ないから中程度の場合、実行中の合計をその場で計算するのは非常に高速であり、合計を計算、保存、維持するために多くのコードを記述する必要はありません。

テーブルにインデックスを付ける!

  • 特定の製品のすべてのトランザクションをすばやく取得できるように、production_transaction.product_idに(またはそれから始まる)インデックスがあることを確認してください。

  • product_id, transaction_dateと、product_idおよび日付範囲(または> =今日)を指定するクエリの組み合わせのインデックスは、特定の製品の1日のトランザクションを提供し、パフォーマンスが向上します。

テスト!

これをテスト/ Q&A環境で必ずテストしてください!代表的なトランザクションの負荷を生成しますが、予想される場合と予期しない場合のパフォーマンスを確認するために、はるかに高い負荷も生成します。

トランザクションレベルが高い場合でも、実行中の合計の更新と保存に関連するパフォーマンスと、クエリの頻度とを比較検討する必要があります。

4
Colin 't Hart

実際、正しいインデックスが存在する場合、比較的短い時間で計算されたデータを受け取ります。この場合、実行中の合計の保存などに関連するデータ操作を実行する必要はありません。インデックスを使用すると挿入時間が長くなりますが、影響は非常に小さくなります(ほとんどありません)。たとえば、product_transactionのクラスター化インデックス(主キーである必要はありません)が(transaction_dateフィールドに)作成される場合、必要な日付範囲のトランザクションの画面がすぐに表示されます。追加のインデックス(同じテーブル上、ただしquantity列を含むフィールドproduct_id上)は、必要なproduct'sのすべての数量をすばやく返すのに役立ちます。

1
Sandr

現在の合計と現在の数量を格納することの欠点は、データを取得する際の応答時間がほとんど高速になるのとは対照的に、ストレージと潜在的なロックです。あなたはそれらの要因を比較検討し、あなたにとってより高価なものを決定する必要があります。ほとんどの場合、データを取得するときの応答時間を改善するためにそれらを保存する方が有益ですが、そうでない場合もあります。

0
Matan Yungman