SQL Server 性能:子查询还是内连接?

3

我一直在思考这个问题:这两个语句哪个性能更高(以及为什么):

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'

一个表单包含多个表单元素,一个表单元素始终是表单的一部分。
谢谢,
Dennis

2
运行它们两个并比较执行计划... - JNK
好主意,说实话我不知道这个功能的存在。但是虽然这回答了什么需要性能,但它并没有真正告诉我为什么需要性能。 - Dennis Röttger
我删掉了我的回答 :) 对于执行计划,它们会告诉你为什么。您将看到操作是否不同,并且执行的操作类型将为您提供推理。 - JNK
2个回答

3

查看执行计划,如果将过滤器添加到连接中,则大多数情况下执行计划将相同。也就是说,连接将返回两个表中的所有内容,而IN不会。

实际上,我更喜欢使用EXISTS

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

“IN” 在执行计划方面也等同于 “exists”,对吗? - JNK
1
是的,应该是一样的。我更喜欢使用 EXISTS,因为你不必担心 NULLS 或者如果你输错了列名,它也不会抛出错误,只要该列名存在于 formelement 表中即可。这里有一个例子:http://forum.lessthandot.com/viewtopic.php?f=17&t=14123 - SQLMenace

1

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

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

(对于复杂的大型查询,SQL 的确切措辞 可能 有所区别,Dan Tow 的书 SQL Tuning 提供了许多很好的建议。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接