3 回答
TA贡献1828条经验 获得超3个赞
我希望第一个查询更快,主要是因为您有一个等效项和一个显式的JOIN。以我的经验,IN
运算符非常慢,因为SQL通常将其评估为一系列WHERE
由“ OR”(WHERE x=Y OR x=Z OR...
)分隔的子句。
与ALL THINGS SQL一样,您的里程可能会有所不同。速度很大程度上取决于索引(您是否在两个ID列上都有索引?这将有很大帮助...)。
唯一可以百分百确定哪个更快的真实方法是打开性能跟踪(IO Statistics特别有用)并同时运行它们。确保在两次运行之间清除缓存!
TA贡献1818条经验 获得超3个赞
好吧,我相信这是一个“古老而又黄金”的问题。答案是:“取决于!”。表演是如此精致,以至于说:“从不使用子查询,总是加入”,这太愚蠢了。在以下链接中,您会发现一些我发现非常有帮助的基本最佳实践:
优化子查询
使用半联接转换优化子查询
将子查询重写为联接
我有一个包含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,好的。
TA贡献1853条经验 获得超9个赞
开始查看执行计划,以了解SQl Server将如何解释它们的差异。您还可以使用Profiler实际多次运行查询并获得差异。
我不希望它们有如此可怕的区别,当您使用关联子查询时,使用连接而不是子查询可以真正获得较大的性能提升。
EXISTS通常比这两个中的任何一个都要好,并且当您要在左连接中要所有记录都不在左连接表中时,使用NOT EXISTS通常是更好的选择。
添加回答
举报