2017-07-13 85 views
2

最近偶然發現了這種情況。在我的情況下,做這兩個查詢可能是「光明」的,我只是想知道什麼時候更好的大數據集。整體上更好(性能,速度等)。多個查詢vs單(多個有多個連接)

目前我做的2 1單查詢:N(具有多)關係並減少/應用程序中的轉換數據。

它看起來像這樣變換/減少:

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

實際上,我莫名其妙地誘惑,只是做單獨的查詢,因爲它消除減少它,如果我有2個以上的hasMany查詢的痛苦,是相當多可讀但目前代碼正常,所以我可能會在下次做。

妥協值得嗎?同樣,在我的情況下,它可能非常「輕」,因爲我只有幾行(< 100),並且結構並不複雜,因爲它處於早期階段。

但在被問及萬一我絆倒這下一次時,當數據集變得更大。

**我談論編輯**

所以具有一對多的關係是:A 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

在一般情況下,你應該發出一個查詢,並讓優化完成這些工作你。至少,這節省了多次往返數據庫和查詢編譯。

有在多個查詢可以有更好的表現情況,但我認爲這是更好地開始與一個單一的查詢。

你必須沿着多個多到許多方面加入關於特定問題。不需要「一般地」進行連接,然後「減少」結果。有更有效的方法。

我建議你問另一個問題。提供樣本數據,期望的結果以及對您嘗試的邏輯的解釋。您可能能夠學習更有效的方式來編寫單個查詢。

+0

我提供了一個通用的示例數據。我會提供一個具體的例子,因爲你要求它。這對我來說仍然是有效的。 – jen

0

你沒有描述你的表結構,所以我假設一些東西。 如果你想擁有寵物和手機作爲一個行做:

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更快地向寵物和電話進行2次查詢。但是,除非你有幾百萬行,否則不是那麼重要。 當然,你應該在customer_id上有索引。