在MsSQL上加入vs预选的性能

时间:2015-03-18 11:52:05

标签: sql sql-server performance

我可以通过以下两种方式执行相同的查询,#1会因为我们没有加入而更有效吗?

1

select table1.* from table1 
inner join table2 on table1.key = table2.key 
where table2.id = 1

2

select * from table1 
where key = (select key from table2 where id=1)

3 个答案:

答案 0 :(得分:2)

这些正在做两件事。如果子查询返回多行,则第二个将返回错误。

在实践中,我猜您在table2(id)table2(id, key)上有一个索引,idtable2是唯一的。在这种情况下,两者都应该进行索引查找,性能应该非常可比。

而且,性能问题的一般答案是:在您的服务器上使用您的数据进行尝试。这确实是了解性能差异是否会对您的环境产生影响的唯一方法。

答案 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)