2010-05-17 67 views
1

我需要检查数据库中是否存在一行;然而,我正在试图找到能够提供最佳性能的方法。最好用一个例子来总结。SQL在子集上选择

假设我有如下表:

dbo.Person(
FirstName varchar(50), 
LastName varchar(50), 
Company varchar(50) 
) 

假设这个表有数百万行,但是只有列Company有索引。

我想知道是否存在FirstNameLastNameCompany的特定组合。我知道我可以这样做:

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 

这样,它只会对更窄的数据集合进行表扫描。

我知道上面的查询将不能工作,但有一个查询,会吗?

哦,我无法创建临时表,因为用户将只具有读取权限。

回答

0

IF EXISTS(...)是最快的方式。如果优化器计算索引将更快,那么优化器将使用可用的索引来满足过滤条件。只要找到一行,IF EXISTS就会退出。

确保您的统计信息是最新的......

+0

啊,非常感谢。 出于好奇,用于将我的部分问题转化为代码形式的标签是什么? 非常感谢 – Adam 2010-05-17 04:10:15

+0

@Adam:只要把4个空格你的代码。或突出显示所有代码,然后按101010图标(下一个双引号图标(地球图标旁边)) – Hao 2010-05-17 04:16:33

+0

非常感谢所有快速回复 – Adam 2010-05-17 04:17:53

0

FWIW,这是有效的SQL:

select * 
from (select * from dbo.Person where Company = @Company) t 
where t.FirstName = @FirstName and t.LastName = @LastName 

而且通过一个别名只能从您的查询不同。米奇在帖子中说,IF EXISTS会更快。

您可以使用查询分析器找出优化器将决定这样做。