何时使用多个查询而不是多个连接更好?

5
在SO上有很多类似“Multiple Queries vs Single Query”的问题,但我没看到有一个通用的结论,因此我仍然对此感到困惑。
所以,用另外一种方式来问:
何时最好运行多个查询而不是一个具有多个连接的单个查询?
我不是在问那些简单的情况,显然,连接两个或三个表比执行3个查询要快得多。
我想到的是例如您有10个以上的连接,并且其中一些连接是多对多关系,因此您的最终查询具有GROUP_CONCAT,LEFT和INNER连接等。例如,你想要产品名称,但也包括所有它们的图像,标签,视频以及可以购买它的所有方向。是制作非常长的带复杂连接和group_concat查询比执行有关产品详细信息的查询以及有关图像、标签等的其他查询更好呢?如果无法使用distinct,这通常非常难以管理。
如果需要澄清问题,我可以提供一个特定的例子。但我希望有一个这种情况的通用规则。何时使用单个连接查询会更劣于多个查询?
此外,在那些需要运行多个SELECT查询的情况下:
在事务(autocommit = false)中运行它们更快吗?
将这些多个SELECT合并到具有多个子查询的单个查询中更快吗?
谢谢!

仅供参考:https://dev59.com/YlnUa4cB1Zd3GeqPaXTy#6772599 - ypercubeᵀᴹ
5个回答

1
我认为,当传输的数据比单个查询大数个数量级时,每行重复的数据可能会成为严重问题。我曾经有一个查询,单独执行时产生了约10兆字节的传输数据,但由于字段被重复多次,内部连接产生了900兆字节的下载数据。软件花费了80%的时间仅用于下载查询结果。这就是软件分析发挥作用的地方,它可以告诉你在软件中花费最多时间的地方。

1
“单个带连接的查询何时比多个查询更糟糕?”这个问题的限制在哪里?
我认为很难画出一个明确的限制,这取决于您的场景和情况。可能有多种因素,如索引、分区、连接列、行数、查询结构等等。
例如,连接5个列的多个连接,其中连接列是键,大多数行的值不同(例如性别),并且具有适当的索引,可能比仅连接两个表而没有适当索引的查询更快。
我想人们可以为自己设定限制,例如您可以决定特定用例(例如插入或选择)不能超过1秒,如果超过了这个时间,就需要进行更多的优化。

是的,但我考虑的是好的查询,我的意思是使用良好的索引等,在性别列中使用索引并不好,我们的连接应始终使用PK完成。至少这就是我做的,我的所有表都有一个ID,并且我正在使用该ID进行所有连接。 - Enrique
那么最快的运行方式呢? - aF.

1
“这要看情况”是唯一有效的答案。没有硬性规定“如果大于X个连接,则将其分解”的规则。(如果有的话,那么X每隔几年就必须更改。我今天写的东西可能会使10年前的平均服务器变慢。)
话虽如此,确定截止点的最佳工具是经验。您编写、测试和实验代码的次数越多,CROSS JOIN 您对现有硬件和数据集的熟悉程度就越高,您就能够编写出最佳查询。这绝不意味着只有嘲笑SQL-92标准扩展的大师才能编写最优化的查询。新程序员可以通过合理的努力编写出“足够好”的代码,正如名称所示,这通常对于大多数任务来说已经足够好了。

你说得对,@Philip Kelley,但我没有预料到会有像“超过X个连接就需要拆分”这样严格的限制。我期望有一些指南,例如:(以下只是示例,我不知道是否正确)如果你需要group_concat,那么可能应该拆分;如果你需要带有distinct的group_concat,则肯定最好使用多个查询;如果你遇到类似于“X”的情况,则可能最好使用多个查询等。也就是说,在选择多个查询而不是多个连接时?在这种情况下,使用autocommit false更好吗?使用子查询更好吗? - Enrique
那什么是最快的运行方式? - aF.

1

如果你需要一次性获取所有相关数据,或者相关数据非常大(例如带有图像的 LOBS),我建议你加入而不是运行单独的选择。

如果你不需要一次性获取大量相关数据,那么考虑“惰性初始化”,即在被要求时查询该大数据。


那么最快的运行方式呢? - aF.

1
Where is the limit? when a single query with Joins is worst than multiple queries?

这将取决于优化器。随着查询变得更加复杂,优化器选择不良执行计划的风险增加。

仅选择处理表格的顺序就可以有N!种方式,其中N是查询的表格数量。使用5个表格有120种方式,使用10个表格则有惊人的3628800种方式。而这只是优化器必须做出的其中一个决策。


那么你是说表(连接)的数量是有限制的吗?例如,如果你有10个连接,也许最好开始考虑拆分它? - Enrique
那么最快的运行方式呢? - aF.
我想说的是,当你连接多个表时,优化器做出错误选择的风险更大。对于Oracle数据库而言,我观察到这种情况在连接7个或更多表时会发生。 - Klas Lindbäck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接