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

问题描述 投票:1回答:1

在旧代码中,我找到了如下索引:

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'
sql-server indices
1个回答
0
投票

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

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;

enter image description here

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

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

© www.soinside.com 2019 - 2024. All rights reserved.