Sql 什么时候多个查询比多个联接更好?

Sql 什么时候多个查询比多个联接更好?,sql,performance,select,join,Sql,Performance,Select,Join,SO中有许多类似的“多查询vs单查询”类型的问题。 但是我没有看到任何一个有一般性结论的,所以我仍然对此感到困惑 因此,我会用其他方式问: 什么时候运行多个查询而不是使用多个联接运行单个查询更好? 我并不是在要求简单的情况,显然连接两个或三个表要比执行三个查询快得多 例如,我在考虑10+连接的情况,其中一些连接是多对多关系,因此最终查询具有GROUP_CONCAT、左连接和内连接的混合等 例如,您需要产品名称,还需要他们的所有图像、标签、视频以及您可以购买的所有方向。 最好是使用复杂的联接和组连

SO中有许多类似的“多查询vs单查询”类型的问题。
但是我没有看到任何一个有一般性结论的,所以我仍然对此感到困惑

因此,我会用其他方式问:

什么时候运行多个查询而不是使用多个联接运行单个查询更好?

我并不是在要求简单的情况,显然连接两个或三个表要比执行三个查询快得多

例如,我在考虑10+连接的情况,其中一些连接是多对多关系,因此最终查询具有GROUP_CONCAT、左连接和内连接的混合等

例如,您需要产品名称,还需要他们的所有图像、标签、视频以及您可以购买的所有方向。
最好是使用复杂的联接和组连接进行很长的查询(如果不能使用distinct,则很难管理),或者执行产品详细信息查询、图像查询、标签查询等

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

此外,在这些情况下,何时最好运行多个SELECT查询:
在事务内部运行它们更快(autocommit=false)?
将单个查询中的多个选择与多个子选择合并起来更快?

谢谢

限制在哪里?当带有连接的单个查询比多个查询更糟糕时

我不认为画一个极限很容易,这在很大程度上取决于你的情景和情况。可能有多个因素,如索引、分区、连接列、行数、查询结构等

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

我想人们可能会为自己设置限制,例如你可以决定这个特定的用例(例如插入或选择)不能超过1秒,如果需要超过1秒,可能需要进行更多的优化。

老实说,“这取决于”是唯一有效的答案。有并且不可能有“如果大于X的连接,则打破它”的硬性规定。(如果有的话,那么X将不得不每隔几年更换一次。我今天写的东西可能会让10年前的普通服务器陷入困境。)

话虽如此,确定临界点的最佳工具是经验。编写、测试和试验代码越多,交叉连接越多,您就越熟悉“现在”必须使用的硬件和数据集,您就越能够编写最佳查询。这绝对不是说只有嘲笑SQL-92标准扩展的大师才能编写最佳查询。通过合理的努力,新程序员可以生成“足够好”的代码,正如其名字所说,对于大多数任务来说,这通常是足够好的

Where is the limit? when a single query with Joins is worst than multiple queries?
这取决于乐观主义者。随着查询变得越来越复杂,优化人员选择执行计划不佳的风险也会增加


只需选择处理表的顺序即可在N中完成!方法,其中N是查询的表数。5张桌子有120种方式,10张桌子有3628800种。这只是优化人员必须做出的决定之一。

我想说的是,当您一次需要所有相关数据时,或者如果相关数据非常大(例如带有图像的LOB…),您会加入而不是运行单独的选择


如果您不需要一次全部使用大型相关数据,那么请考虑“惰性初始化”,即在请求时查询该大型数据。

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


我曾经有过一个查询,每个查询产生了大约10兆的传输数据,但由于字段被重复了很多次,内部连接产生了900兆的下载数据。该软件80%的时间都花在下载查询结果上。这就是软件评测发挥作用的地方,它将告诉您在软件的哪个部分花费的时间最多。

举个例子:那么您是说表(联接)的数量是一个限制?例如,如果您有10个联接,那么最好开始考虑拆分它?那么运行它的最快方法是什么?我是说,当您联接多个表时,乐观主义者将做出错误选择的风险更大。对于Oracle,我在7+个表中观察到了这一点。是的,但我在考虑好的查询,我的意思是使用好的索引等,在性别列中使用索引是不好的,我们的连接应该始终使用PK来完成。至少我是这么做的,我所有的表都有一个ID,我所有的连接都是用这个ID进行的。那么运行它的最快方式呢?你是对的@Philip Kelley,但我没想到会出现像“需要拆分的连接超过X个”这样严格的情况。我期待着某种类型的指导,也就是:(这些只是例子,我不知道这是不是真的)如果你需要group_concat,那么也许你应该拆分,如果你需要的不仅仅是group_concat和distinct,那么多个查询当然更好,如果你有这样的情况。。。“X”则可能是更好的多个查询,等等。也就是说,当您选择多个查询而不是多个联接时?在这种情况下,最好使用autocommit false?使用子选择更好吗?运行它的最快方法是什么?运行它的最快方法是什么?