2017-07-13 45 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上有索引。