1

好奇心からですが、実行したときに大きなパフォーマンスの違いがあるかどうかは誰にもわかりません...

Select something Where foo=1 

...と...

Select something Where foo In(1)    #just one item not multiple

...単一または結合された SQL クエリでの Mysql と Postgresql の両方。

問題は、 Ruby on Rails スコープを構築していて、どちらのアプローチが優れているのか疑問に思っていることです。

複数のアイテム (IN) に対して 1 つのスコープを作成し、等しい (=) を使用する単一のアイテムに対して 1 つのスコープを作成します。

scope :with_owner_ids, lambda{|owner_class, *ids| where(owner_type: owner_class.model_name, owner_id: ids.flatten)}
scope :with_owner, lambda{|owner| where(owner_type: owner.class.model_name, owner_id: owner.id)}
#... where `foos`.`owner_class`='User' and `foos`.`owner_id` = 15

またはよりきれいに、複数のアイテムのスコープを作成し(IN)、このスコープを単一のアイテムの他のスコープに渡すだけではありません(INも)

scope :with_owner_ids, lambda{|owner_class, *ids| where(owner_type: owner_class.model_name, owner_id: ids.flatten)}
scope :with_owner, lambda{|owner| with_owner_ids(owner.class, owner.id)}
#... where `foos`.`owner_class`='User' and `foos`.`owner_id` IN (15)
4

2 に答える 2

4

非常に単純なテーブルでの PostgreSQL の例:

CREATE TABLE a (
    a_id integer
    , t_id integer
);

COPY a
FROM STDIN;
1   1
2   1
3   1
4   4
\.

EXPLAIN ANALYZE SELECT * FROM a WHERE t_id IN (1);

 Seq Scan on a  (cost=0.00..36.75 rows=11 width=8) (actual time=0.056..0.059 rows=3 loops=1)
   Filter: (t_id = 1)
 Total runtime: 41.795 ms

そのFilter: (t_id = 1)部分から、単純な等値チェックに変換されたことは明らかですIN (1)。したがって、2 つの形式に違いはありません。

MySQLの部分は他の人に任せます:)

于 2012-12-10T11:49:48.020 に答える