加入查询或子查询

时间:2009-03-18 14:31:04

标签: sql join subquery

开发人员在使用join而不是子查询时是否有经验法则,或者它们是否相同。

8 个答案:

答案 0 :(得分:5)

第一个原则是“准确地陈述查询”。第二个原则是“简单而明显地陈述查询”(这是您通常做出选择的地方)。第三个是“陈述查询以便有效处理”。

如果它是一个带有良好查询处理器的dbms,那么等效的查询设计应该会导致查询计划相同(或者至少同样有效)。

我第一次使用MySQL时最大的挫败感是我必须有意识地预测优化器。经过Oracle,SQL Server,Informix和其他dbms产品的长期使用经验,我很少期望自己关注这些问题。现在使用较新版本的MySQL会更好,但它仍然需要比其他版本更频繁地关注。

答案 1 :(得分:3)

在性能方面,它们在大多数现代数据库引擎中没有任何区别。

答案 2 :(得分:3)

子查询的问题在于,您可能会在没有任何键的情况下结束子结果集,因此加入它们会更加昂贵。

如果可能的话,总是尝试使用ON子句而不是WHERE进行JOIN查询和过滤(尽管它应该是相同的,因为现代引擎已针对此进行了优化)。

答案 3 :(得分:2)

理论上,每个子查询都可以更改为连接查询。

答案 4 :(得分:2)

取决于RDBMS。您应该比较两个查询的执行计划。

根据我对Oracle 10和11的经验,执行计划总是一样的。

答案 5 :(得分:2)

与许多事情一样,这取决于。 - 子查询有多复杂 - 在查询中执行子查询的频率

我尽量避免使用子查询。特别是当期望大型结果集从不使用子查询时 - 如果为结果集的每个项执行子查询。

小心, 亚历

答案 6 :(得分:2)

让我们暂时忽略性能影响(如果我们知道“过早优化是所有邪恶的根源”,我们就应该这样做。)

选择看起来更清晰,更易于维护的内容。

答案 7 :(得分:1)

在SQL Server中,相关子查询通常比连接表现更差,或者通常甚至更好地表现为连接到派生表。我几乎从不为任何必须多次执行的事情编写子查询。这是因为相关子查询通常基本上将您的查询转换为游标并一次运行一行。在数据库中,通常最好以基于集合的方式进行操作