2011-04-29 28 views
3

我一直在思考这个问题,其与2个报表可能有更高的性能(为什么):SQL Server性能 - 子选择还是内部联接?

select * from formelement 
where formid = (select id from form where name = 'Test') 

select * 
from formelement fe 
inner join form f on fe.formid = f.id 
where f.name = 'Test' 

一种形式包含一些表单元素,一个表单元素是始终是一种形式的一部分。

感谢,

丹尼斯

+2

运行它们都和比较执行计划... – JNK 2011-04-29 11:52:21

+0

不错的想法,说实话,我不知道这个功能存在。但是,尽管这回答了什么需要性能的问题,但它并没有真正告诉我这是什么原因。 – 2011-04-29 11:56:10

+0

我删除了我的答案:)对于执行计划,他们会告诉你为什么。你会看到操作是否不同,并且执行的操作类型会给你推理。 – JNK 2011-04-29 12:01:37

回答

1

的性能取决于查询计划由SQL Server引擎选择。查询计划取决于很多因素,包括(但不限于)SQL,确切的表结构,表格的统计信息,可用索引等。

由于您的两个查询非常简单,我猜测会导致相同的(或非常相似的)执行计划,从而产生可比较的性能。

(对于大型,复杂的查询,该SQL 的确切措辞可以有所作为,丹拖书SQL Tuning给出了很多很好的建议,这一点。)

3

看看执行计划,最有可能将是相同的,如果你加过滤的加盟,认为加入将两个表中返回的一切,将在不会

其实我更喜欢EXISTS在这两个

select * from formelement fe 
where exists (select 1 from form f 
       where f.name='Test' 
       and fe.formid =f.id) 
+0

'IN'对于这个也是等同的,正确的(exec计划明智的)? – JNK 2011-04-29 11:54:11

+1

是的,应该是相同的,我喜欢更多的存在,因为您不必担心NULLS,或者如果错误地输入了列名,如果列名存在于formelement表中,那么它不会引发错误。示例:http://forum.lessthandot.com/viewtopic.php?f=17&t=14123 – SQLMenace 2011-04-29 11:55:55