1. ホーム
  2. java

[解決済み] SQLで計算を行う場合とアプリケーションで計算を行う場合の長所と短所を教えてください。

2022-04-23 12:53:11

質問

shopkeeper テーブルには以下のフィールドがあります。

id (bigint),amount (numeric(19,2)),createddate (timestamp)

例えば、上記のようなテーブルがあるとします。昨日分のレコードを取得し 金額をセントに出力してレポートを作成します。

一つの方法は、私のJavaアプリケーションで計算を実行し、簡単なクエリを実行することです。

Date previousDate ;// $1 calculate in application

Date todayDate;// $2 calculate in application

select amount where createddate between $1 and $2 

そして、私のJavaアプリケーションで、レコードをループして金額をセントに変換し、レポートを作成します。

もう一つの方法は、SQLクエリ自体で計算を実行するようなものです。

select cast(amount * 100 as int) as "Cents"
from shopkeeper  where createddate  between date_trunc('day', now()) - interval '1 day'  and  date_trunc('day', now())

そして、レコードをループしてレポートを生成します。

一方では、私のすべての処理はJavaアプリケーションで行われ、単純なクエリが発行されます。 もう一つのケースでは、すべての変換と計算は、Sqlクエリで行われます。

上記の使用例は一例であり、実際のシナリオでは、テーブルには同様の処理を必要とする多くのカラムが存在することがあります。

パフォーマンスなどの面でどのアプローチが良いか、その理由を教えてください。

解決方法は?

それは多くの要因によりますが、最も重要なのは、その要因です。

  • 計算の複雑さ(アプリサーバー上で複雑な計算を行う方が、スケーラブルなので好ましい アウト DB サーバーよりも。 アップ )
  • データ量(多くのデータにアクセス/集計する必要がある場合、データベースサーバーで行うことで帯域幅を節約でき、集計をインデックス内で行うことができればディスクIOも節約できます)。
  • 利便性 (SQLは複雑な作業に最適な言語ではありません。特に手続き的な作業には向いていませんが、セットベースの作業には非常に適しています。但し、エラー処理はお粗末です)

いつものように、もしあなたが する データをアプリサーバーに戻すには、列と行を最小化することが有利になります。クエリのチューニングと適切なインデックス作成は、どちらのシナリオでも有効です。

あなたのメモを参照してください。

そして、レコードをループします。

ループ SQLでは、レコードを次々に処理することは、ほとんどの場合、間違ったことです。

一般論として しかし、サーバーでエレガントなクエリーを実行すれば、帯域幅を大幅に節約できるシナリオの例も常にあります。

また、「計算コストがかかるなら、どこかにキャッシュできないか」ということも考えてみてください。

もし 正確 どちらの方が優れているかは、両方の方法でコーディングして比較してください。しかし、典型的な使い方を考慮してください。もし、実際には一度に5回(別々に)呼び出されるのであれば、それをシミュレートしてください。