2010-10-03 258 views
0

说tableA有1行要返回,但将返回100列,而tableB有100行要返回,但每个行只有一列。 TableB有一个用于表A的外键。哪一个更有效率:2个单表查询或1个连接查询

将tableA和tableB的左连接返回100 * 100个数据单元,而2个单独的查询返回100 + 100个单元的数据或50次的数据,或者是误解怎么运行的?

使用许多简单的查询而不是更简单的查询会更高效吗?

+1

它实际上是'101 * 100'和'100 + 100'(A的100列,B的1列)。 – RedFilter 2010-10-03 10:52:54

+0

@RedFilter你说得对,我总是犯这样的错误! – kjack 2010-10-03 10:57:37

+0

根据你的一些评论,我认为你需要澄清你的问题中“效率”是指什么。我假设端到端的效率;也许你的意思是效率限于数据库服务器资源消耗? – RedFilter 2010-10-03 12:40:39

回答

4

首先,我会质疑一个有100列的表格,并建议您的模式可能有更好的设计。在现实世界中,这个列的数量不太常见,所以通常一个查询返回的数据量与两个查询返回的数据量的差异变得不那么重要。表中的100列并不一定是坏的,只是一个可以考虑的标志。

但是,假设你的数字是他们是什么弄清楚的问题,都需要考虑的几个重要变量:

1 - 什么是数据库服务器和应用服务器之间的链接速度?如果速度非常慢,那么最好尽量减少返回的数据量与运行的查询数量。如果速度不慢,那么在执行两个查询时,您可能会花费更多时间,而不是返回增加的有效负载。哪一个更好只能通过在你自己的环境中进行测试来确定。

2 - 传输协议本身的效率如何?也许有某种数据压缩,或者知道第2列到第101列的更聪明的算法对于每一行都是重复的,所以它只会传递一次。运输协议中的这种策略可以缓解您的任何担忧。再次,这就是为什么你需要在自己的环境中进行测试以确定知道。正如其他人所指出的那样,你也需要考虑一旦你得到数据会做什么(例如JOINs,GROUPing等),但是我限制了我对你的问题的具体细节的回应计数与有效载荷大小。

+0

+1速度是最重要的。 SQL连接将比在应用程序中将数据拼凑在一起更快,但您需要考虑是否会通过传输更多数据来损失所有这些以及更多。是的,100列太多了。 – 2010-10-03 11:20:03

+0

聪明的传输协议,例外,答案中的共识似乎是tableA中的ata将被传输100次。 – kjack 2010-10-03 11:37:12

+0

正如您猜测的那样,我选择了100行用于说明目的,但有时会出现连接和连接,然后在可能产生类似效果的一个查询中进行外连接。尤其是当人们选择所有的列而不是特定的列时 – kjack 2010-10-03 11:39:47

1

我认为你的问题基本上是关于database normalization。通常,建议将数据库规范化为多个表(使用主键和外键),并在查询时根据需要将它们连接起来。这对于插入/更新性能和保持数据一致性更好,并且通常也会导致更小的数据库大小。

至于返回的行号,只有交叉连接实际上会返回100 * 100行;任何内部或外部连接都不会创建所有组合,而是将给定条件下的行连接在一起,而对于外部连接则保留无法匹配的行。维基百科在其JOIN article中有一些样本。

对于查询量非常大的应用程序,性能可能在使用较少规范化表格时效果会更好。不过,如同优化一样,我只会考虑在看到真正可衡量的问题(例如使用分析工具)后进入该方向。

一般来说,尽量保持数据库往返的次数少;大量的单个简单查询将遭受与DB引擎(网络等)交谈的开销。如果您需要执行复杂的一系列语句,请考虑使用存储过程。

+0

他并不是在谈论100 * 100行,他正在谈论100行100列(100 * 100个单元格)。与单独检索100列的1行相关,然后从相关表中检索1列100行。 – 2010-10-03 11:16:15

+0

在该wikipedia JOIN文章文章中说(在左外部连接下)“左表中的值将针对右表上的每个不同行重复”。这似乎表明来自tableA的数据被多次传输。 – kjack 2010-10-03 11:50:33

+0

@kjack,外连接的工作原理与内连接的工作方式相同(可能会重复行 - 我会谈到这一点),但与来自左,右或两个数据集的连接谓词不匹配的行不会丢弃但保留。在任何联接中,如果一个谓词匹配多个行,它将重复每个匹配行的联接,即“重复” - 但不限于外部联接。 – Lucero 2010-10-03 13:13:16

2

什么是最好的加入?数据库引擎或客户端代码?说,我使用这两种技术:它取决于客户端和如何使用数据。

  • 这里的数据需要一些处理,比如说,在网页上渲染我可能会拆分标题和细节记录集。我们这样做是因为我们在数据库和HTML之间有一些业务逻辑

  • 在简单线性消耗的地方,我会加入数据库以避免不必要的处理。例如,简单的报告或出口

+0

也是KISS原则,我发现写短的查询更容易! – kjack 2010-10-03 11:42:26

1

这取决于,如果你只考虑到SQL效率obviusly几个简单和更小的结果的查询效率会更高。 但是,如果在客户端上进行连接,或者需要在连接后过滤结果,则需要考虑整个过程,那么在代码上执行该操作可能会更有效。

编码通常是不同系统,数据库与客户端,内存与CPU之间的权衡......您需要对此有意识并尝试找到完美的解决方案。

在这种情况下,大概2个查询优于1,但这不是一个通用的解决方案。

2

只要查询返回的是实际相关的数据,通常只有较少的查询会提高性能。试图将不相关的数据放入同一个查询中以减少数量或查询没有意义。

当然有例外,你的例子可能是其中之一。然而,这取决于返回领域的数量,比如领域实际返回的数量,即实际的数据量。

作为查询数量如何影响性能的一个例子,我可以提到一个解决方案,我已经(很遗憾地)看过很多次。在这种解决方案中,程序员首先会从一个表中获取大量记录,然后遍历记录并对每个记录运行另一个查询以从另一个表中获取相关记录。这显然导致了很多查询,而具有一个或两个查询的解决方案将更有效率。

1

“是前所未有的高效率使用许多简单的查询,而不是更少的更复杂的?”

,要求数据穿过的最低金额,并为您提供不超过你所需要的查询是效率更高。除此之外,RDBMS特定的条件可以在一个RDBMS系统上比另一个更高效。在非常低的水平上,当处理更少的数据时,可以更快地检索结果,因此高效的查询只能使用最少量的数据来处理查询结果。

相关问题