开发人员何时使用联接而不是子查询是否有经验法则,或者它们是否相同。
8 回答
第一个原则是“准确地陈述查询”。第二个原则是“简单明了地陈述查询”(这是您通常做出选择的地方)。第三个是“说明查询,以便有效处理”。
如果它是一个具有良好查询处理器的 dbms,那么等效的查询设计应该会产生相同的查询计划(或至少同样有效)。
我第一次使用 MySQL 时最大的挫败感是我必须有意识地预测优化器。在长期使用 Oracle、SQL Server、Informix 和其他 dbms 产品之后,我很少期望自己会关注这些问题。现在使用更新版本的 MySQL 会更好,但与其他版本相比,我最终需要更频繁地关注它。
在性能方面,它们在大多数现代数据库引擎中没有任何区别。
子查询的问题是您可能会在没有任何键的情况下结束子结果集,因此加入它们会更昂贵。
如果可能,请始终尝试使用 ON 子句而不是 WHERE 进行 JOIN 查询和过滤(尽管它应该是相同的,因为现代引擎为此进行了优化)。
理论上,每个子查询都可以更改为连接查询。
取决于关系数据库管理系统。您应该比较两个查询的执行计划。
根据我使用 Oracle 10 和 11 的经验,执行计划总是相同的。
与许多事情一样,这取决于。- 子查询有多复杂 - 在查询中子查询多久执行一次
我尽量避免子查询。尤其是当期望大的结果集永远不要使用子查询时——以防子查询是针对结果集的每个项目执行的。
保重,亚历克斯
现在让我们忽略性能影响(如果我们知道“过早的优化是万恶之源”,我们应该这样做)。
选择看起来更清晰、更易于维护的内容。
在 SQL Server 中,相关子查询的性能通常比连接更差,或者甚至在性能方面甚至更好,连接到派生表。我几乎从不为必须多次执行的任何事情编写子查询。这是因为相关子查询通常基本上将您的查询变成游标并一次运行一行。在数据库中,通常最好以基于集合的方式做事