13

データベースに日付のあるエントリがいくつかあります。何が一番いいですか?:

  • sqlステートメントを使用してそれらをフェッチし、を適用しますorder by
  • sqlでリストを取得し、アプリケーション内でそれらを注文しますcollection.sortか?

ありがとう

4

4 に答える 4

10

これは非常に幅広い質問であり、答えるのは非常に困難です。それは、あなたが何を意味するのかによって大きく異なります

  • パフォーマンスの観点からは、システムのどの部分がボトルネックであるかを判断するために測定する必要があります。データベースは通常非常に効率的ですが、それでもクライアントに機能するオフロードに関連する可能性があります。

  • 関心の分離の観点からは、アプリケーションでの並べ替えの重要性と、アプリケーションの階層化方法によって異なります。

「データが並べ替えられているという知識はどこにあるのか」と自問してみてください。および「リレーショナルデータベースストレージから別のストレージに変更した場合はどうなりますか」。

于 2012-10-28T11:03:07.930 に答える
4

ある程度、それは完全なコレクションにいくつの値があるかに依存します。たとえば、20〜30の値の場合は、どこでも並べ替えることができます。比較的貧弱な並べ替えアルゴリズムでも、すばやく並べ替えることができます(ただし、ストゥージソートは避けてください。ひどいです)。これは、予想されるデータチャンクのサイズの種類です。実際に1つのサービス応答をフェッチします。

しかし、より大きなデータセットに入ると、もっと慎重に計画する必要があります。特に、必要がない場合は、データを移動しないようにする必要があります。データが現在データベースにのみ存在する場合は、データを並べ替えるためだけにすべてをクライアントにフェッチして(比較的コストのかかる操作)、事実上すべてを破棄する必要はありません。最初にデータベースでデータを並べ替えておく方がはるかに優れているため、データを順番に取得するのは簡単です。リレーショナルデータベースの用語では、データの並べ替えを維持することは、データのインデックスを維持することと機能的に同じです。実際、データに複数のインデックスを付けることができるため、かなり複雑なクエリでもすばやく実行できます。(NoSQL DBはより多様であり、データの並べ替えを維持するという概念をサポートしていないものもあります。

したがって、質問に戻ると、アプリケーションでデータを並べ替えないようにする必要があります。ほとんどのデータでは、コードが不要なデータを見ることさえできないため、適切なインデックスの方がはるかに効率的です。ただし、他の理由ですべてをアプリケーションにフェッチする必要があり、事前に並べ替えることができない場合は、自分で並べ替えるのを避ける理由はありません。Javaの並べ替えアルゴリズムは効率的で安定しています。ただし、DBから新しい順序でフェッチする方が速いかどうかを測定する必要があります。(問題は、DBのオーバーヘッドが再ソートの超線形コストを超えているかどうかです。多くの問題は、「多分;わかりにくい」が答えであるドメインにあります。)

バランスを取るもう1つの点は、コードがそれ自体をソートせず、代わりに常にそれをDBに委任する方が簡単かどうかです。コードをよりシンプルに(そしてよりバグのない状態に)保つことは、持つべき良い目標です…</ p>

于 2012-10-28T21:59:25.717 に答える
0

データベース管理システム(DMBS)はこれらのタスク用に最適化されているので、それらに固執する必要があると思います。特に、PHPまたは(他のスクリプト言語)で記述されたスクリプトからデータベースにアクセスしている場合は、スクリプトを使用してそのタスクを実行するのが遅くなる可能性があります。スクリプトを使用して配列を並べ替えると、PHPで使用できるメモリ制限に達する可能性もあります。

さまざまなプログラミング言語のパフォーマンスについて問題を提起するつもりはありません。可能な限りDMBSに依存することは非常に良い習慣であることを指摘したいと思います。

于 2012-10-28T10:59:56.903 に答える
-1

これは私にとって非常に興味深い質問であり、受け入れられた答えの反対側を提示したいと思います。ところで、これは非常に良い答えであり、必ずしも*同意しない*わけではありません。反対側を提示したいだけです。私がキャリアを始めたとき、私はメインフレームDB2に取り組んでいました、そして私に教えてくれた昔の人たちは、データベースの外でソートが行われることを非常に強く主張していました。これに対する彼らの合理的な理由は、オフロードできるのは作業であり、これによりDBは他の要求を自由に処理できるようになるということです。もちろん、これよりもはるかに微妙な違いがあります。一般的に、あなたが検討している要因は次のとおりです。A)データベースはどれくらい忙しい、またはシステムの中心ですか?データベースが非常にビジーである場合、クライアントまたはアプリサーバーで多くのOLTP処理があり、クライアントまたはアプリケーションサーバーに多くの過剰容量がある場合、アプリサーバーまたはクライアントで並べ替えてみませんか?効率が低下した場合でも、システム全体に作業が分散され、システム全体の観点からスループットが向上します。B)種類の大きさはどれくらいですか?たとえば、膨大な数のデータを並べ替えたために、コールスタックやJavaヒープを爆破するのはばかげています。C)アプリまたはアプリサーバーで並べ替えると、一時停止や遅延などが発生しますか?言い換えると、特定のプログラミング言語に本当に悪いソートライブラリがあり、独自のライブラリを作成したくない場合は、アプリケーションに5.0秒かかるよりも、DBに0.5秒かかる方がよいでしょう。膨大な数のデータをソートしたため、コールスタックまたはJavaヒープを爆破します。C)アプリまたはアプリサーバーで並べ替えると、一時停止や遅延などが発生しますか?言い換えると、特定のプログラミング言語に本当に悪いソートライブラリがあり、独自のライブラリを作成したくない場合は、アプリケーションに5.0秒かかるよりも、DBに0.5秒かかる方がよいでしょう。膨大な数のデータをソートしたため、コールスタックまたはJavaヒープを爆破します。C)アプリまたはアプリサーバーで並べ替えると、一時停止や遅延などが発生しますか?言い換えると、特定のプログラミング言語に本当に悪いソートライブラリがあり、独自のライブラリを作成したくない場合は、アプリケーションに5.0秒かかるよりも、DBに0.5秒かかる方がよいでしょう。

したがって、すべてのものと同様に、「それは依存します」;-)。しかし、私はこれらがそれが依存するものだと思います。

于 2014-04-01T20:20:24.627 に答える