【问题标题】:SQL Selects on subsets子集上的 SQL 选择
【发布时间】:2010-05-17 04:00:35
【问题描述】:

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

假设我有下表:

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

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

我知道上面的查询行不通,但是有没有可以行的查询?

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

【问题讨论】:

    标签: sql subset


    【解决方案1】:

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

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

    【讨论】:

    • 啊,非常感谢。出于好奇,正如您在上面所做的那样,用于将我的部分问题转换为代码形式的标签是什么?非常感谢
    • @Adam:只需在您的代码中添加 4 个空格。或突出显示所有代码,然后按 101010 图标(下一个双引号图标(地球图标旁边))
    【解决方案2】:

    FWIW,这是有效的 SQL:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-26
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多