2017-07-13 10 views
2

最近、この状況に遭遇しました。私の状況では、両方のクエリを「軽い」ものにすることができます。私は、大きなデータセットについては、何が良いのかを知りたいだけです。全体的に優れています(パフォーマンス、スピードなど)。複数のクエリと単一のクエリ(複数の結合が多数あります)

現在、私は2 1:N(has-many)関係の単一クエリを行い、アプリケーション内のデータを縮小/変換します。

それは、この変換/縮小のようになります。

[ 
    'field' => 'value', 
    'hasMany-1' => [], 
    'hasMany-2' => [] 
] 

私が実際にどういうわけか、それは私が2つの以上のhasManyのクエリを持っていた場合、それを軽減する痛みを解消し、よりかなりあるようちょうど別のクエリを行うように誘惑しています読めるがコードは現在動作しているので、次回にやってみよう。

妥協点はありますか?再び、私の状況では、私はわずかな行(< 100)しか持たず、構造がまだ初期段階にあるので複雑ではないので、非常に「軽い」かもしれません。

しかし、私はこの次回に遭遇した場合、およびデータセットが大きくなると尋ねられます。

**私が話しているEDIT **

のであり、多くの関係は以下のとおりです。customerがあり、多くのphonespets

私の現在のクエリは私にこの結果(簡体字)を返します:

customer_id | pet_name | phone 
1   | john  | 1234 
1   | john  | 5678 
2   | jane  | 1357 
2   | jane  | 2468 
2   | joe  | 1357 
2   | joe  | 2468 

私は私のクエリは罰金だと思います。他のフィールドが異なる値を持つため、一部の行が繰り返されることは論理的です。

答えて

4

一般に、単一のクエリを発行して、オプティマイザがあなたのために作業を行うようにする必要があります。少なくとも、これはデータベースとクエリのコンパイルへの複数回のラウンドトリップを節約します。

複数のクエリでパフォーマンスが向上する場合がありますが、1つのクエリで開始する方がよいと考えています。

複数の多対多ディメンションに沿った結合に関して、特に問題があります。ジョインを「一般的に」行い、結果を「減らす」必要はありません。もっと効率的な方法があります。

別のに質問することをお勧めします。サンプルデータ、望ましい結果、お試しのロジックの説明を提供してください。 1つのクエリを書くより効率的な方法を学ぶことができます。

+0

一般的なサンプルデータを提供しました。私はあなたがそれを要求してから具体的な例を提供します。それは私のためにこの質問にはまだ有効です。 – jen

0

テーブル構造を記述していないので、私はいくつかのことを想定しています。 あなたは1行がそうであるようにペットと携帯電話を持つようにしたい場合:

select c.customer_id, c.name, 
     array_to_string((array_agg(p.pet_name)),',') pet_names 
     array_to_string((array_agg(ph.phone)),',') phones 
    from customer c, pet p, phones ph 
where p.customer_id=1 
    and p.customer_id=c.customer_id 
    and ph.customer_id=c.customer_id 
group by c.customer_id, c.name 

あなたはすべての可能な電話番号とpet_nameあたりの行にしたい場合:

select c.customer_id, c.name, 
     p.pet_name 
     array_to_string((array_agg(ph.phone)),',') phones 
    from customer c, pet p, phones ph 
where p.customer_id=1 
    and p.customer_id=c.customer_id 
    and ph.customer_id=c.customer_id 
group by c.customer_id, c.name, p.pet_name 

を、我々は、パフォーマンスの話なら、それはなりますcustomer_idによってseparetlyペットと携帯電話への2つのクエリを行うために速く。しかし、あなたが何百万もの行を持つまでそれほど重要ではありません。 もちろん、customer_idにインデックスを付ける必要があります。

関連する問題