16

最近、同じテーブルから異なるデータが必要な状況がいくつかありました。一例として、各「配送ドライバー」をループ処理し、配送先の顧客ごとに印刷可能な PDF ファイルを生成します。

この状況で、すべての顧客をプルして、

List<Customer> AllCustomersList = customers.GetAllCustomers();

配送ドライバーをループするときは、次のようにします。

List<Customer> DeliveryCustomers = AllCustomersList.Where(a => a.DeliveryDriverID == DriverID);

私の質問: 配送ドライバーに関連付けられた顧客レコードについて、毎回データベースにクエリを実行するよりも、List オブジェクトにクエリを実行する方が高速ですか?

4

3 に答える 3

15

行数の正確な数はありません。それを渡す場合は、代わりにインメモリで DB をクエリする必要があります。List<T>

しかし経験則では、DB は大量のデータを処理するように設計されており、インメモリにはそのようなものはありませんが、最適化の「メカニズム」があります。

そのため、DB へのラウンドトリップが重要なたびにその行数に対して価値があるかどうかを確認するために、ベンチマークを行う必要があります。

「わずかな効率については忘れるべきです。たとえば、約 97% の確率で:時期尚早の最適化は諸悪の根源です

于 2012-05-06T00:52:03.327 に答える
1

Redisを使用しないのはなぜですか? 、これはメモリ内データベースであり、非常に高速です。

于 2016-10-28T07:36:12.220 に答える
1

DB へのラウンド トリップを回避することは、特に DB がネットワーク上にあり、複数のユーザーがアクセスする場合に、データベース パフォーマンス チューニングに関する主要なルールの 1 つです。

別の観点から言えば、顧客データのように大きな結果セットをメモリに取り込むことは効率的ではなく、必要なときに DB に移動するよりもおそらく高速ではありません。

ラウンド トリップを回避するためのメモリ内コレクションの有効な使用法は、頻繁に変更されないルックアップ テーブル (つまり、顧客カテゴリ、顧客地域など) です。そうすれば、メインの顧客選択クエリでの結合を回避して、さらに高速化できます。

于 2012-05-06T04:26:00.070 に答える