SQL 在同一列上定义主键时仍然需要服务器索引?

SQL Server indexes still needed when primary key defined on same columns?

当我在一个列上有一个主键时,我是否还需要在同一列上有一个非聚集索引以用于查询目的?主键是索引,不是吗?

此外,如果我在两列上有一个聚合主键,我是否需要在这两列上创建索引以用于查询目的?

最后,如果我经常查询指定两列进行匹配的行,是否最好有一个包含两列的索引?还是两个单独的索引,每个索引一个?

When I have a primary key on a column, do I also need a non-clustered index on that same column for querying purposes? Primary keys ARE indexes, aren't they?

常规 索引是一个(或多个)列的排序副本。排序后可以快速搜索。如果其基础值发生变化,它将相应地重新排序,但物理 table 顺序保持不变。

另一方面,

A 聚集 索引定义了物理table 顺序。这就是为什么您只能拥有一个 - 如果它的值发生变化,整个 table 将相应地重新排序。

通常主键也是table的聚集索引。但不一定 - 主键的定义 属性 是它的唯一性。

在同一列上使用聚簇索引和非聚簇索引是多余的,您不应该这样做。它在 insert/update/delete 期间增加了工作量,但对查询性能没有任何作用。

if I have an aggregate primary key on two columns, do I need to create indexes on both of those columns for querying purposes?

这取决于您是否想单独查询第二列。 (A, B) 上的索引不会对仅搜索 B 的查询执行任何操作,因此在这种情况下有必要在 B 上创建第二个索引。

在索引中包含您希望从查询中 return 的任何额外列。如果设置得当,仅索引就可以满足查询,从而使数据库引擎根本不必查看 table。

请注意,这适用于非聚集索引。没有必要为针对聚集索引的查询包含额外的列,因为聚集索引 而 table。它自然包含所有列。

if I will be commonly querying for rows specifying two columns to match, is it best to have one index that includes both columns? Or two separate indexes, one on each?

有一个包含两列的索引,最有选择性的(唯一值的最大方差)或您最有可能首先查询的索引,其次是辅助值。有时有必要同时使用 - (A, B) 和 (B, A),这完全取决于 table 的使用方式。

创建主键时,会自动创建聚集索引。如果您在此列上有任何 JOINS 或 WHERE 条件,则 JOIN 和搜索会更快,因为引擎会知道您要查找的记录的物理位置。

在你的情况下,我会说如果你有一个主键,它是几个列的组合,你要么在单个列上搜索/加入你需要一个非聚集索引。否则分配一个主键将做这个把戏

更多信息请参考:https://www.simple-talk.com/sql/performance/tune-your-indexing-strategy-with-sql-server-dmvs/