什么时候更好的多个查询而不是多个连接?

时间:2011-12-07 14:32:51

标签: sql performance select join

在SO中,“多个查询与单个查询”类型有很多类似的问题 但我没有看到任何一般结论,因此我仍然对此感到困惑。

所以,我会用其他术语来问:

何时更好地运行多个查询而不是具有多个联接的单个查询?

我不是要求琐碎的案例,显然加入两个或三个表比执行3个查询要快得多。

我正在考虑例如你有10个以上连接的情况,其中一些连接是多对多的关系,所以你的最终查询有GROUP_CONCAT,混合了LEFT和INNER连接等。

例如,您需要产品名称,以及所有图像,以及所有标记,以及所有< em>视频,以及您可以购买的所有路线 最好使用复杂的连接和group_concat进行非常长的查询(如果你不能使用distinct,这很多次很难管理),或者对产品细节执行查询,对图像执行查询,另一个用于查询标签等?

如果有助于澄清问题,我可以写一个特定的例子。但我希望这种情况有一个普遍的规则 限制在哪里?当使用Joins的单个查询比多个查询更糟糕时?

并且,在那些情况下,何时更好地运行多个SELECT查询:
在事务中运行它们的速度更快(autocommit = false)?
在具有多个子选择的单个查询中合并这些多个选择会更快吗?

谢谢!

5 个答案:

答案 0 :(得分:1)

  

限制在哪里?当使用Joins的单个查询比多个查询更糟糕时?

我认为很难设定限制,这在很大程度上取决于您的情况和情况。可能有多种因素,如索引,分区,连接列,行数,查询结构e.t.c。

多个连接,例如连接5列,其中连接列是键,大多数行(例如性别)的值不相同,并且具有适当的索引可能比仅连接两个没有适当索引的表的查询更快。

我想One可能会为自己设置限制,例如,您可以决定此特定用例(例如插入或选择)不得超过1秒,如果超过1秒,则可能需要更多优化。

答案 1 :(得分:1)

“这取决于”老实说是唯一有效的答案。有,并且可以没有硬性“如果大于X加入然后分解”规则。 (如果有,那么X必须每隔几年更换一次。我今天写的东西可能会在10年前陷入普通服务器。)

话虽如此,确定截止点的最佳工具是经验。您编写,测试和试验代码的次数越多,CROSS JOIN越熟悉您必须“现在”使用的硬件和数据集,您就能越好地编写最佳查询。这绝对不是说只有嘲笑SQL-92标准扩展的专家才能编写优化查询。通过合理的努力,新程序员可以生成“足够好”的代码,顾名思义,这通常对大多数任务来说都足够好。

答案 2 :(得分:1)

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

这取决于优化者。随着查询变得越来越复杂,优化器选择差的执行计划的风险也会增加。

只需选择处理表格的顺序就可以在N中完成!方式,其中N是查询的表的数量。有5个表有120种方式,10个表高达3628800.这只是优化者必须做出的决定之一。

答案 3 :(得分:1)

我会说当你需要一次性相关数据或者相关数据真的很大(例如带有图像的LOBS ......)时,你会加入而不是单独选择。

如果您不需要同时使用大型相关数据,那么请考虑“延迟初始化”,在您要求查询大数据时。

答案 4 :(得分:1)

我还要说,当传输的数据大于单个查询的数量级时。每行重复的数据可能是一个严重的杀手。

我有一次查询,单独产生大约10美分的传输数据,但是通过内部连接,由于字段重复这么多次而产生了900兆的数据下载。该软件花了80%的时间只下载查询结果。这是软件配置文件发挥作用的地方,它将告诉您软件在哪里花费最多的时间。