我想知道我是否有一个像这样的加入查询 -
Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id
和一个子查询类似的东西 -
Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept)
当我考虑性能时,两个查询中哪一个会更快,为什么?
还有什么时候我应该选择其中一种而不是另一种?
抱歉,如果这太微不足道了,之前就问过,但我对此感到困惑。另外,如果你们能给我建议我应该用来衡量两个查询性能的工具,那就太好了。非常感谢!
最佳答案
嗯,我相信这是一个“古老但黄金”的问题。答案是:“这要看情况!”。 性能是一个如此微妙的主题,以至于说“永远不要使用子查询,总是加入”就太愚蠢了。 在以下链接中,您将找到一些我认为非常有帮助的基本最佳实践:
- Optimizing Subqueries
- Optimizing Subqueries with Semijoin Transformations
- Rewriting Subqueries as Joins
我有一个包含 50000 个元素的表,我要查找的结果是 739 个元素。
我最初的查询是这样的:
SELECT p.id,
p.fixedId,
p.azienda_id,
p.categoria_id,
p.linea,
p.tipo,
p.nome
FROM prodotto p
WHERE p.azienda_id = 2699 AND p.anno = (
SELECT MAX(p2.anno)
FROM prodotto p2
WHERE p2.fixedId = p.fixedId
)
执行时间为 7.9 秒。
我最后的查询是这样的:
SELECT p.id,
p.fixedId,
p.azienda_id,
p.categoria_id,
p.linea,
p.tipo,
p.nome
FROM prodotto p
WHERE p.azienda_id = 2699 AND (p.fixedId, p.anno) IN
(
SELECT p2.fixedId, MAX(p2.anno)
FROM prodotto p2
WHERE p.azienda_id = p2.azienda_id
GROUP BY p2.fixedId
)
花了 0.0256 秒
好 SQL,好。
关于SQL 连接与 SQL 子查询(性能)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856164/