2012-12-12 3 views
7

Java + JPA/Hibernate + Mysqlの具体的なケースを尋ねていますが、この質問を多数の言語に適用できると思います。クエリまたはコードを使用するタイミング

場合によっては、従業員などのエンティティを取得するためにデータベースに対してクエリを実行する必要があります。特定の特定の従業員(最初の名前が「John」のもの)が必要な場合は、この正確な従業員を返すクエリを実行するか、すべての従業員を検索してからプログラミング言語を使用して取得することをお勧めしますあなたが興味を持っているものは? なぜ(簡単、効率)? どちらが(一般的に)より効率的ですか?

テーブルのサイズによっては、他の方法よりも優れていますか?

考慮:

  • 同じ複雑さ、両方の場合の再利用性が。
+4

何が良いですか:家庭でたくさんの食べ物を保管したり、少しずつ買いますか?あなたがたくさん旅行するとき?パーティーを主催するときだけ?それは依存しているのですか?同様に、最適なアプローチはパフォーマンスの最適化の問題です。それは多くの変数を伴います。この技術は、ソリューションを設計する際に自分自身を絵に描こうとするのを防ぎ、実際のボトルネックが分かったら後で最適化することです。 http://en.wikipedia.org/wiki/Performance_tuning良いスタートポイントはここにあります。多かれ少なかれ普遍的に役立つと思われるものがあります。データアクセスをうまくカプセル化してください。 –

+0

私はあなたの答えは本当にあなたが最も学ぶことができると言うでしょう! – dgmora

+0

@ dgarcia、ありがとうございます。あなたが受け入れることを望む場合に備えて、私はそれを回答にプロモートしています。 –

答えて

4

多くの場合、プログラミングには頻繁に使用されます。操作の高速化のためにメモリを使用します。あなたが従業員の多くを持っている場合、それらの重要な部分を1つ1つ質問します(たとえば、75%が一度にクエリされるか他のクエリでクエリされます)、次にすべてをクエリします。キャッシュ )、メモリ内のルックアップを完了します。次回の照会では、RDBMSへの移動をスキップし、キャッシュに直進し、高速ルックアップを行います。データベースへのラウンドトリップは、メモリー内ハッシュ・ルックアップと比較して非常に高価です。

一方、従業員の一部にアクセスする場合、RDBMSからプログラムへのデータ転送には多くの時間とネットワーク帯域幅、多くのメモリが必要ですあなたの側では、RDBMS側の多くのメモリがあります。たくさんの行を照会して、1つを除いてすべてを捨てることは決して意味をなさない。

10

常にデータベースでクエリを実行します。そうしなければ、クライアントに多くのデータをコピーする必要はなく、効率的にデータを効率的にフィルタリングするためのデータベースも書かれています。

私が考えることができる唯一の例外は、フィルタ条件が計算上複雑で、データベースが持つよりも多くのCPU能力で計算を広げることができるということです。

私はデータベースを持っている場合、サーバーはクライアントよりも多くのCPU能力を持っています。オーバーロードされない限り、同じ量のコードに対してより迅速にクエリを実行します。

また、クライアント上のデータを操作するコードを記述するのではなく、Hibernateクエリ言語を使用してデータベースに対してクエリを実行するコードを少なくする必要があります。 Hibernateのクエリは、さらにコードを書く必要なしに、コンフィグレーションでクライアントキャッシュを使用します。

2

状況は変わりません。私は一般的には、正確な結果セットを得るためにsqlを使用する方が良いと思います。

すべてのエンティティを読み込んでプログラムで検索する際の問題は、すべてのエンティティを読み込んでメモリが大量に消費されてしまうことです。さらに、すべてのエンティティを検索する必要があります。 RDBMSを活用して、必要な正確な結果を得ることができるときに、なぜそうするのですか?言い換えれば、大量のメモリを使用して大量のデータセットをロードし、処理してRDBMSで処理できるようにするのはなぜですか?

一方、データセットのサイズもそれほどわからない場合は、メモリにロードして照会することができます。これは、RDBMSに行く必要がないという利点があります。システムのアーキテクチャによっては、ネットワークを経由する必要があるかもしれません。

ただし、さまざまなキャッシュユーティリティを使用して共通のクエリ結果をキャッシュすることができます。これにより、データを自分でキャッシュする利点がなくなります。

4

一般に、私はデータベースに何が良いのかをデータベースに任せます。データのフィルタリングはデータベースが本当にうまくいくものなので、そこに残すのが一番良いでしょう。

つまり、コードをすべて取り込んでフィルタリングしたいという状況があります。行の数が比較的少なく、それらをあなたのアプリにキャッシュする予定があるなら、私は考えることができます。その場合は、すべての行を検索し、キャッシュし、キャッシュ内のものに対して後続のフィルタリングを実行するだけです。

2

あなたのアプローチは時間の経過とともに拡大縮小する必要があることに注意してください。小さなデータセットである可能性があるものは、後で大量のデータセットになる可能性があります。私たちは、テーブル全体を照会して操作を実行するアプリケーションをコーディングしたプログラマーに問題がありました。このアプローチは、2つの副選択を含むわずか100行の場合にうまく機能しましたが、データが長年に渡って成長するにつれ、パフォーマンスの問題が明らかになりました。最後の365日だけを照会する日付フィルタを挿入すると、アプリケーションの拡張に役立ちます。

1

- あなたは冬眠する特定の答えを探している場合は、マークの答え@チェック

従業員の数は、時間をオーバースケールすることができ-assuming従業員の例を考えると、照会するアプローチを使用することをお勧めします正確なデータのためのデータベース。 しかし、データが急速に成長する可能性が低いDepartment(たとえば)のようなものを検討している場合は、それらのすべてを照会してメモリに保存すると便利です。毎回外部リソース(データベース)が必要となり、コストがかかる可能性があります。

だから一般的なパラメータは、使用の

  • 周波数が
  • いくつかの意味を入れて

  • 重要度データの商務
  • ボリュームへのデータの

    1. スケーリング、これらは、ときデータは頻繁に縮尺されることはなく、データはミッションクリティカルではなく、データ量はメモリ上で管理可能であるpplication serverであり、頻繁に使用されます - 必要に応じて、すべてを持ち、プログラム的にフィルタリングします。

      それ以外は特定のデータのみを取得します。

  • 1

    何が良いですか:家庭でたくさんの食べ物を保管したり、少しずつ購入したりしますか?あなたがたくさん旅行するとき?パーティーを主催するときだけ?それは依存しているのですか?同様に、最適なアプローチはパフォーマンスの最適化の問題です。それは多くの変数を伴います。この技術は、ソリューションを設計する際に自分自身を絵に描こうとするのを防ぎ、実際のボトルネックが分かったら後で最適化することです。良い出発点はここにあります:en.wikipedia.org/wiki/Performance_tuning多かれ少なかれ普遍的に役立つと思われるものがあります。データアクセスをうまくカプセル化してください。

    +0

    私は答えとしてそれを選んでいませんでした。なぜなら、それはまさに主要な話題に「答える」わけではないからです。 – dgmora

    関連する問題