SQL 服务器索引中的两列但仅查询一列
SQL Server two columns in index but query on only one
在遗留代码中我找到了如下索引:
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'
是的,你是对的。但是如果你的 table 有很多列:
A
B
C
D
..
F
例如,您的主键索引是 (A)
,如果您有第二个索引,例如 (B,C)
,如果您使用这样的查询,引擎可能会决定使用它:
CREATE TABLE dbo.Whosebug
(
A INT
,B INT
,C INT
,D INT
,E INT
,PRIMARY KEY (A)
,CONSTRAINT IX UNIQUE(B,C)
)
SELECT A
,C
FROM dbo.Whosebug
WHERE C = 0;
因此,如果索引可以用作 covering
,即使您对某些列不感兴趣,引擎也可能会使用它,因为它会决定执行更少的工作(更少的读取) .
在您的情况下,id
列上的 PK 似乎是与 name
列上的第二个索引相结合的更好选择。
在遗留代码中我找到了如下索引:
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'
是的,你是对的。但是如果你的 table 有很多列:
A
B
C
D
..
F
例如,您的主键索引是 (A)
,如果您有第二个索引,例如 (B,C)
,如果您使用这样的查询,引擎可能会决定使用它:
CREATE TABLE dbo.Whosebug
(
A INT
,B INT
,C INT
,D INT
,E INT
,PRIMARY KEY (A)
,CONSTRAINT IX UNIQUE(B,C)
)
SELECT A
,C
FROM dbo.Whosebug
WHERE C = 0;
因此,如果索引可以用作 covering
,即使您对某些列不感兴趣,引擎也可能会使用它,因为它会决定执行更少的工作(更少的读取) .
在您的情况下,id
列上的 PK 似乎是与 name
列上的第二个索引相结合的更好选择。