在旧代码中,我找到了如下索引:
CREATE CLUSTERED INDEX ix_MyTable_foo ON MyTable
(
id ASC,
name ASC
)
如果我理解正确,则此索引对于单独查询列id
或id
和name
很有用。我正确吗?
因此,这样做可能会改善记录的检索:
select someColumn from MyTable where id = 4
但是此查询将不执行任何操作:
select someColumn from MyTable where name = 'test'
是的,你是对的。但是,如果您的表有很多列:
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
列上的第二个索引结合使用似乎是更好的选择。