【问题标题】:SQL Server two columns in index but query on only oneSQL Server 索引中有两列,但只查询一列
【发布时间】:2020-08-24 01:26:27
【问题描述】:

在遗留代码中我发现了一个索引如下:

CREATE CLUSTERED INDEX ix_MyTable_foo ON MyTable
(
    id ASC,
    name ASC
)

如果我理解正确,此索引对于单独查询列 ididname 很有用。我说的对吗?

因此,这样做可能会改善对记录的检索:

select someColumn from MyTable where id = 4

但它不会对这个查询做任何事情:

select someColumn from MyTable where name = 'test'

【问题讨论】:

  • 是的,你的理解是绝对正确的——任何多列索引只有在你查询 (n) 最左边的列时才有用——在你的情况下, 单独在 id 上,或者在 idname 上 - 但不是单独在 name 上。

标签: sql sql-server indices


【解决方案1】:

是的,你是对的。但是如果你有很多列的表:

A
B
C
D
..
F

如果你的主键索引是(A),如果你有第二个索引像(B,C),如果你使用这样的查询,引擎可能会决定使用它:

CREATE TABLE dbo.StackOverflow
(
    A INT
   ,B INT 
   ,C INT 
   ,D INT 
   ,E INT
   ,PRIMARY KEY (A)
   ,CONSTRAINT IX UNIQUE(B,C)
)

SELECT A     
      ,C 
FROM dbo.StackOverflow
WHERE C = 0;

因此,如果索引可以用作covering,即使您对某些列不感兴趣,引擎也可能会使用它,因为它将决定执行更少的工作(更少的读取)。

在您的情况下,id 列上的 PK 似乎是结合 name 列上的第二个索引的更好选择。

【讨论】:

  • 如果我的 where 子句提到了两列,但 where 子句的顺序与索引中的不一样,那么索引仍然适用对吗?示例:select 1 from MyTable where name='test' and id=4
  • 是的,将使用索引。这个can中的子句顺序无关紧要。
猜你喜欢
  • 2012-07-31
  • 1970-01-01
  • 2023-03-04
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多