SQL 查询性能加入条件

SQL Query Performance Join with condition

召集所有 sql 专家。我有以下 select 声明:

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id
 WHERE t1.field = xyz

我有点担心这里的表现。 where 子句是在连接之前还是之后评估的?如果在之后评估,有没有办法先评估 where 子句?

整个 table 可以很容易地包含超过一百万个条目,但是在 where 子句之后它可能只剩下 1-10 个条目所以在我看来这确实是一个很大的性能差异,具体取决于 where 的时间子句被评估。

提前致谢。

迪米

对于这个查询:

SELECT 1
FROM table1 t1 JOIN
     table2 t2
     ON t1.id = t2.id
WHERE t1.field = xyz;

最佳指标为table1(field, id)table2(id)

查询的执行方式取决于优化器。给定 table 统计信息和环境,它的任务是选择基于执行计划。

您可以这样重写您的查询:

SELECT 1
  FROM (SELECT * FROM table1 WHERE field = xyz) t1
  JOIN table2 t2 ON t1.id = t2.id

但是根据数据库产品的不同,优化器可能仍然决定最好的方法是将表 1 连接到表 2,然后应用约束。

每个 DBMS 都有自己的查询优化器。因此,按照事物的逻辑,如果像您这样的 WHERE 将首先执行,然后 JOIN 查询的一部分

如评论和其他有关性能的答案中所述,答案始终是 "it depends",具体取决于您的 dbms 和基表的索引查询可能没问题,优化器可能首先评估 where .或者,如果索引满足连接要求,连接可能仍然有效。

或者,您可以通过减少 t1 的数据集来强制执行所需的行为,然后按照理查德的建议使用嵌套 select 进行连接,或者将 t1.field = xyz 添加到连接中

ON t1.field = xyz AND t1.id = t2.id

就个人而言,如果我需要在加入之前减少数据集,我会使用 cte

With T1 AS 
(
   SELECT * FROM table1
   WHERE T1.Field = 'xyz'
)
SELECT 1 
FROM T1
JOIN Table2 T2
ON T1.Id = T2.Id