题
我需要检查,如果在数据库中存在一个行;不过,我想找到可以做到这一点提供最佳性能的方式。这最好用一个例子概括。
让我们假设我有以下表格:
dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)
假设这个表具有百万行,但是只有列Company
具有索引。
我想找出是否FirstName
,LastName
和Company
的特定组合的存在。我知道我可以做到这一点:
IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End
但是,如果我错了,会做一个全表扫描。
什么我真的希望它做的是它采用了索引的查询。通过上面的表格,我知道下面的查询将有很大的性能,因为它使用索引:
Select * from dbo.Person where Company = @Company
反正有做只对数据子集的搜索?例如是这样的:
select * from (
Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName
这样一来,它只会上的数据的窄得多的收集做表扫描。
我知道上面是行不通的查询,但有一个查询,会吗?
哦,我无法创建临时表,因为用户只能读取访问。
解决方案
IF EXISTS( ...)
是最快的形式。优化器将使用一个可用的索引来满足过滤条件,如果它计算索引会更快。 IF EXISTS
将尽快行被发现退出。
请确保您的统计信息是最新的......
其他提示
FWIW,这是有效的SQL:
select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName
和从查询由一个别名只不同。该IF EXISTS
会更快米奇在他的帖子里说。
您可以使用查询分析器找出优化器将决定这样做。
不隶属于 StackOverflow