我可以通过以下两种方式执行相同的查询,#1会因为我们没有加入而更有效吗?
select table1.* from table1
inner join table2 on table1.key = table2.key
where table2.id = 1
select * from table1
where key = (select key from table2 where id=1)
答案 0 :(得分:2)
这些正在做两件事。如果子查询返回多行,则第二个将返回错误。
在实践中,我猜您在table2(id)
或table2(id, key)
上有一个索引,id
中table2
是唯一的。在这种情况下,两者都应该进行索引查找,性能应该非常可比。
而且,性能问题的一般答案是:在您的服务器上使用您的数据进行尝试。这确实是了解性能差异是否会对您的环境产生影响的唯一方法。
答案 1 :(得分:0)
我在运行set statistics io on后执行了这两个语句(在SQL Server 2008 R2 Enterprise上 - 据说与Standard相比具有最佳优化)。
从x2内连接##价格中选择前5 * x1.LIST_PRICE = ## prices.i1
和
从x2中选择前5 *,其中LIST_PRICE(从##价格中选择i1)
并且统计信息完全匹配。我总是喜欢第一种类型的连接,但第二种类型允许我只选择该部分并查看返回的行。
我被教导说,加入vs子查询在性能方面大多相当。我还会查看生成的查询计划,看看是否有一个比另一个好。查询计划完全匹配。
答案 2 :(得分:0)
MS SQL Server足够聪明,可以理解在这样一个简单的查询中它是相同的操作。 但是,如果在子查询中有超过1条记录,那么您可能会使用IN。 In是慢速运行,它永远不会比JOIN更快。它可以是相同但永远不会更快。 您的案例的最佳选择是使用EXISTS。它将始终更快或与JOIN或IN操作相同。例如:
select * from table1 t1
where EXISTS (select * from table2 t2 where id=1 AND t1.key = t2.key)