调用所有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子句。
提前致谢。
迪米
答案 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