2009-06-04 11 views
8

「distinct」(oracle)を使用するSQL問合せを使用すると、Javaプログラミングで一意の結果を取得するよりも高速になるでしょうか?sqlがJavaプログラミングよりも速く「distinct」の場合

oracle sql distinctが重いと聞きましたが、Javaプログラミングによる手動の「区別」よりも重いですか?

おかげで、 フランツ

答えて

25

親指のルールは、データがプログラミング言語よりもデータベースで処理される方が速いということです。

理由は、データがデータベースにすでに利用可能であり、それはあなたのアプリケーションに行くの手間を省くことである:データベースからのドライバーのための

  • マーシャリングデータ。
  • ネットワーク転送;
  • ドライバからアプリケーションへのデータのアンマーシャリング。 にそれが意味することができますどのよう
  • オラクルDISTINCTが重いことについては

、されることはありません単にそれは良いアイデアのように思えるという理由だけで、クエリでDISTINCTを投げる - それ以来セット現実的なデータでそれをプロファイルパフォーマンスに重大な影響を及ぼす可能性があります。

11

2つの側面:

  • あなたはJavaへのデータ転送を持っている場合は、その転送を行うためのすべてのオーバーヘッドがあります。データベースでの作業は、必要のないデータを転送する必要がないことを意味します。
  • データベースは、索引やキャッシュなどを使用して作業を高速化できます。

私は、すべてのデータをフェッチしてから、Javaで別の操作を実行するほうがデータベースで実行するほうが速いことに非常に驚いています。

1

通常、メモリのデータ操作は高速ですが、重複がたくさんあることがわかっている場合は、DB上で区別する方がよいでしょう。さもなければ、はるかに多くのネットワーク帯域幅とメモリを使用します。実際にはデータに依存します。

+0

私はオラクルがメモリ内で別個の操作を行うと思います。どのようにそれを行うには?私はあなたの答えを理解していません。 – tuinstoel

+0

私は一般的なデータ操作について話していました。 DISTINCTのような本質的なDB機能ではありません。たとえば、一時テーブルなどを使用して、もう少し複雑なことをする –

0

SQL distinctは、複数の出現を排除する必要があるため「重い」です。これは、最初にデータをソートし、次に等しい要素でランを除去することによって達成することができます。重量は、この操作を行うのに要するという事実に関連しています。

ここでの慣用的な解決策は、データベースに問題が発生した場合に、パフォーマンスを向上させることです。

3

私の時代になって、動物がまだ話していて、自分のアタリでゲームをしているとき、不要なネットワークトラフィックを作り出すのは悪いことでした。

必要以上に多くのデータを取得するのは簡単ではありませんでした。私がすべてのデータを取得し、それをJavaで操作して別個の値を取得することができる唯一の理由は、少し後で他のデータも必要になる場合です。だからそれをキャッチする。

注:これは、サーバー上ですべてを行うということと同じではなく、データ操作をさらにサポートする環境でデータを操作することは良いことです。

6

アプリケーションがデータベースよりも高速に処理できれば、データベースは非常に壊れています(ただし、アプリケーションがかなり高速に実行されている場合を除きます)。機械)。もちろん、データベースはいくつかの作業(ソートまたはハッシュテーブルを使用して重複を排除する)を行う必要がありますが、アプリケーションも同じです!

データベースがうまく機能するアプリケーションでタスクを実行することは、ほとんど常に間違っています。

2

Oracle 9とOracle 10は異なる動作を実行し、Oracle 9は、Oracle 10のハッシュをソートします。いくつかの選択事例では、JavaがOracle 9よりもはるかに速く、Oracle 10よりも遅くなる可能性があります。

オーバーオールOracleはそれをより速く実行できると考えています。 Jon Skeetの答えを参照してください。

3

一般的なルール:データベースにデータベースのジョブを実行させ、メモリ、ネットワーク、CPUを自分の側に保存します。これらのリソースの大半はデータベース側にも費やされますが、生産に行く前に大規模な最適化が行われているため、母親に赤ちゃんを与えてください...

1

オラクル、特に後のバージョンでは、ソートやハッシュなどのDISTINCT操作を実装し、さまざまな方法でテーブルにアクセスします(インデックスやフルスキャンなど)。また、統計や制約を含むデータに関する詳細情報もあり、Javaプログラムが必ずしも知らない最適化を見つけるのに役立ちます。

これは、ここでの主な問題とは別のものです(ここでは他の人が何度か述べたように)。

関連する問題