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)
是的你是对的。但如果你的表有很多列:
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。