1

たとえば、ユーザーが少なくとも3つの注文を持っているかどうかを確認したい

注文テーブルが非常に大きいことを考えると、どちらが良いですか?

a。結果セットのサイズを3に制限し、サイズが一致するかどうかを確認します

NO_OF_MATCHES = 3
orders =  Order.where('user_id = ?', 1).limit(NO_OF_MATCHES )
return true if orders.size == NO_OF_MATCHES 

b。カウントを取得して、それと比較するだけです

NO_OF_MATCHES = 3
count = Order.count(:conditions => ['user_id = ?',1])
return true if count >= NO_OF_MATCHES 

私が考えもしなかったまったく新しい方法も歓迎します

4

2 に答える 2

3

「すべてではなく、3 つの結果のみをフェッチしていることに注意してください。3 つの結果をフェッチする方が速いのか、それとも 100 万レコードをカウントする方が速いのか疑問に思っていたので、質問をしました。」

プラス 1 ~eveevans の回答をしますが、これが長い回答です...

多くの場合、データベースはレコード数を保持し、その数だけを使用するようにクエリの結果を最適化します。場合によっては、個別の値の数、一意のインデックスを持つ値のレコードの数、またはデータベース ベンダーの実装に依存する任意の数のケースを保持します。あなたのクエリは、彼らが追跡し、オプティマイザーが使用できる数にたまたまヒットする可能性があります。そのため、count(*) クエリは、selects よりも高速になることがよくあります。

次に、「SELECT count(*)」を使用すると、1 つの整数列を含む 1 つの行があり、「SELECT *」を使用した結果セットよりもはるかに少ないデータになります。データベースは、レコード内のすべてのフィールドの値を取得する必要があります。(「SELECT id FROM orders LIMIT 3」を実行することも役立ちます。)各レコードの各フィールド値をバイトエンコードする必要があります。次に、クライアント アダプタはバイトを ruby​​ 値にデコードする必要があります。次に、ActiveRecord は列の記述を調べて、属性配列を構築します。カウントするだけで、作業ははるかに少なくなります。

于 2012-09-19T19:40:38.807 に答える
2

数値 (カウント) のみが必要な場合はオプション B を使用します。最初のケースでは条件に一致するすべての注文が返され、2 番目のケースでは条件に一致する注文の数のみが返されます。

于 2012-09-19T16:40:13.783 に答える