SQL查询性能加入条件

时间:2017-05-26 10:45:45

标签: sql performance join where-clause

调用所有sql专家。我有以下select语句:

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

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

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

提前致谢。

迪米

4 个答案:

答案 0 :(得分:2)

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

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

但是根据数据库产品,优化器可能仍然认为最好的方法是将table1连接到table2,然后应用约束。

答案 1 :(得分:1)

对于此查询:

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

最佳索引为table1(field, id)table2(id)

查询的执行方式取决于优化程序。它的任务是根据表统计和环境选择基于执行的计划。

答案 2 :(得分:1)

每个DBMS都有自己的查询优化器。因此,如果您的WHERE首先执行,然后JOIN部分查询

,那么事情的逻辑就会被执行

答案 3 :(得分:1)

正如评论和其他有关表现的答案中所提到的,答案始终是"它取决于"根据您的dbms和基表的索引,查询可能没问题,优化器可以先评估位置。或者,如果索引涵盖了连接要求,则连接可能会有效。

或者,您可以通过在使用理查建议的嵌套选择进行连接之前减少t1的数据集来强制执行所需的行为,或者将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