SQL Server 索引中有两列,但只查询一列

Dev*_*ebs 6 sql sql-server indices

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

CREATE CLUSTERED INDEX ix_MyTable_foo ON MyTable
(
    id ASC,
    name ASC
)
Run Code Online (Sandbox Code Playgroud)

id如果我理解正确,该索引对于单独查询列或id和很有用name。我说的对吗?

因此,它可能会通过执行以下操作来改进记录检索:

select someColumn from MyTable where id = 4
Run Code Online (Sandbox Code Playgroud)

但它对这个查询没有任何作用:

select someColumn from MyTable where name = 'test'
Run Code Online (Sandbox Code Playgroud)

got*_*tqn 3

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

A
B
C
D
..
F
Run Code Online (Sandbox Code Playgroud)

例如,您的主键索引是(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;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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