[解決済み] SQLで計算を行う場合とアプリケーションで計算を行う場合の長所と短所を教えてください。
質問
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回(別々に)呼び出されるのであれば、それをシミュレートしてください。
関連
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
プロローグでのコンテンツは禁止されています
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
プロジェクトの依存関係を解決できなかった 解決
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。