假设tableA有1行要返回,但返回100列,而tableB有100行要返回,但每行只有一列。 TableB有一个表A的外键。
tableA到tableB的左连接是否会返回100 * 100个数据单元格,而2个单独的查询会返回100 + 100个数据单元格或50倍数据,或者是对它的工作方式有误解?
使用许多简单查询而不是更复杂的查询会更有效吗?
答案 0 :(得分:4)
首先,我会质疑一个包含100列的表,并建议您的架构可能有更好的设计。在现实世界中,这些列的数量不太常见,因此通常一个查询与两个查询返回的数据量的差异变得不那么显着。表中的100列不一定是坏的,只是一个被认为是它的标志。
但是,假设您的数字是他们要澄清的问题,那么有一些重要的变量需要考虑:
1 - 数据库服务器和应用程序服务器之间的链接速度是多少?如果速度非常慢,那么最好尽量减少返回的数据量与查询你运行。如果它不慢,那么在执行两个查询时可能会花费更多时间,而不是返回增加的有效负载。哪个更好只能通过在您自己的环境中进行测试来确定。
2 - 传输协议本身的效率如何?也许存在某种压缩数据,或者知道第2列到第101列的更聪明的算法对于每一行都是重复的,所以它只传递一次。传输协议中的此类策略可以减轻您的任何顾虑。同样,这就是为什么你需要在你自己的环境中进行测试才能确定。
正如其他人所指出的,你还需要考虑一旦获得数据将对数据做些什么(例如,JOIN,GROUPing等),但是我限制了我对你的问题细节的回应与有效载荷大小。
答案 1 :(得分:2)
我认为你的问题基本上是database normalization。通常,建议将数据库规范化为多个表(使用主键和外键),并在查询时根据需要将它们连接起来。这对于插入/更新性能以及保持数据一致性更好,并且通常也会导致更小的数据库大小。
对于返回的行号,只有交叉连接实际上会返回100 * 100行;任何内部或外部联接都不会创建所有组合,而是在给定条件下将行绑定在一起,而外部联接则保留无法匹配的行。维基百科在其JOIN article中有一些样本。
对于非常查询密集型应用程序,使用较少的规范化表时,性能可能更好。然而,与优化一样,我只考虑在看到真正可测量的问题后(例如使用分析工具)进入该方向。
通常,尽量保持数据库的往返次数较少;大量单个简单查询将遭受与数据库引擎(网络等)通信的开销。如果需要执行复杂的语句系列,请考虑使用存储过程。
答案 2 :(得分:2)
加入什么是最好的?数据库引擎或客户端代码?说这个,我使用两种技术:它取决于客户端以及如何使用数据。
如果数据需要进行某些处理,比如在网页上呈现,我可能会拆分标题和详细记录集。我们确实使用它,因为我们在DB和HTML之间有一些业务逻辑
在简单和线性消耗的地方,我会加入数据库以避免不必要的处理。例如,简单的报告或导出
答案 3 :(得分:2)
这取决于,如果您只考虑SQL效率,那么几个更简单和更小的结果查询将更有效。 但是,如果在客户端上以其他方式进行连接,或者需要在连接后过滤结果,则需要考虑整个过程,那么DBM在代码上执行此操作可能会更有效。
编码总是在不同的系统,DB与客户端,RAM与CPU之间进行权衡......你需要意识到这一点并尝试找到完美的解决方案。
在这种情况下,可能有2个查询优于1,但这不是一般解决方案。
答案 4 :(得分:2)
通常,只要查询返回实际相关的数据,查询就会产生更好的性能。尝试将不相关的数据放入同一个查询中以减少数量或查询是没有意义的。
当然有例外情况,您的示例可能就是其中之一。但是,它取决于返回的字段数量,例如字段实际返回的数量,即实际的数据量。
作为查询数量如何影响性能的一个例子,我可以提到一个我已经(很遗憾地)多次看到的解决方案。在该解决方案中,程序员首先从一个表中获取许多记录,然后遍历记录并对每个记录运行另一个查询以从另一个表中获取相关记录。这显然会导致大量查询,并且具有一个或两个查询的解决方案将更加高效。
答案 5 :(得分:1)
“使用许多简单查询而不是更复杂的查询会更有效吗?”
需要最少量数据遍历的查询,并且只提供您所需的数据,效率更高。除此之外,RDBMS特定条件可以在一个RDBMS系统上比另一个更有效。在非常低的级别,当您处理较少的数据时,您的结果可以更快地检索,因此高效的查询是仅使用所需数据最少的查询,以获得您正在寻找的结果。