我需要检查,如果在数据库中存在一个行;不过,我想找到可以做到这一点提供最佳性能的方式。这最好用一个例子概括。

让我们假设我有以下表格:

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

这样一来,它只会上的数据的窄得多的收集做表扫描。

我知道上面是行不通的查询,但有一个查询,会吗?

哦,我无法创建临时表,因为用户只能读取访问。

有帮助吗?

解决方案

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会更快米奇在他的帖子里说。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top