2011-04-29 68 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