非聚集索引中是否有主键?

时间:2009-08-13 06:38:46

标签: sql sql-server-2005 tsql

为了尝试为我的数据库做出最佳索引选择,我注意到了一些我想解决的特定行为。

观察下表和相应的索引(SQL Server 2005):

CREATE TABLE demo
(
 id INT PRIMARY KEY IDENTITY,
 name NVARCHAR(50) NOT NULL,
 password BINARY(20) NOT NULL
);

CREATE NONCLUSTERED INDEX idx_demo_foo ON demo ( name, password );

在这种情况下,如果我执行以下查询...

SELECT id FROM demo
WHERE name = @0
AND   password = @1;

...仅发生非聚集索引搜索。这让我很奇怪,因为我没有明确地将id添加到非聚集索引。

3 个答案:

答案 0 :(得分:6)

聚簇索引键始终包含在非聚簇索引中。聚簇索引键是表的行定位符,每个索引必须包含行定位符,以便将索引行与表行匹配。

答案 1 :(得分:0)

NCIX必须包含Clustered Index键,以便系统知道如何到达表本身的底层行。因此,如果您的主键背后有一个聚集索引(默认情况下会这样),那么您很幸运。

当然,如果您更改聚簇索引,或者将表放入堆中,那么您将需要查找才能访问主键。

编辑:我建议从索引键中取出密码字段,并将其作为包含列。当然,您只需按用户名查找条目,然后检查密码是否匹配,而不是为每个用户名设置多个密​​码。

create index ixBlah on demo (name) include (password);

罗布

答案 2 :(得分:-1)

当where子句中的列与索引中的列(有时是相同的顺序)相同时,通常会发生

索引查找。这与主键无关。