加入多个表格:有效过滤的地方

时间:2016-03-31 08:49:13

标签: sql sql-server postgresql

我有四张桌子,大约四张,我希望一起加入。为了使我的代码更清晰和可读(对我而言),我希望立即加入所有内容,然后在最后进行过滤:

SELECT f1, f2, ..., fn
FROM t1 INNER JOIN t2 ON t1.field = t2.field
        INNER JOIN t3 ON t2.field = t3.field
        INNER JOIN t4 ON t3.field = t4.field
WHERE // filters here

但我怀疑将每个表放在子查询中并在每个范围内进行过滤会使性能更好。

SELECT f1, f2, ..., fn
FROM (SELECT t1_f1, t1_f2, ..., t1_fi FROM t1 WHERE // filter here) AS a 
     INNER JOIN
     (SELECT t2_f1, t2_f2, ..., t2_fj FROM t2 WHERE // filter here) AS b
     ON // and so on 

请告知哪些会带来更好的表现和/或如果我的预感是正确的。我愿意牺牲性能来提高可读性。

如果确实每个子查询中的过滤效率更高,那么数据库平台的体系结构是否会产生任何差异,或者这适用于所有RDBMS SQL风格?

我正在使用SQL Server和Postgres。

3 个答案:

答案 0 :(得分:2)

查询优化器将始终尝试从SQL中查找最佳计划。

您应该更专注于编写可读,可维护的代码,然后通过分析执行计划找到查询的低效部分(更有可能)找到数据库和索引设计的低效部分。

将过滤从where子句移动到join子句而不进行任何有意义的分析可能会浪费精力。

答案 1 :(得分:1)

您的第一种方法将始终更好,因为SQL引擎将首先评估条件的位置,然后执行连接。因此,在评估where子句时,如果条件可用,它将过滤记录。

SELECT f1, f2, ..., fn 
FROM t1 INNER JOIN t2 ON t1.field = t2.field
    INNER JOIN t3 ON t2.field = t3.field
    INNER JOIN t4 ON t3.field = t4.field
WHERE // filters here

答案 2 :(得分:0)

如果您已正确索引,加入将始终表现得更好。