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
召集所有 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