1

我需要检查数据库中是否存在一行;但是,我正在尝试找到提供最佳性能的方法。最好用一个例子来概括这一点。

假设我有下表:

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

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

我知道上面的查询不起作用,但是有没有查询可以呢?

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

4

2 回答 2

0

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

确保您的统计数据是最新的...

于 2010-05-17T04:04:14.740 回答
0

FWIW,这是有效的 SQL:

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

并且仅通过别名与您的查询不同。正如米奇在他的帖子中所说,这IF EXISTS会更快。

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

于 2010-05-17T04:11:59.663 回答