当我在列上有主键时,是否还需要在同一列上使用非聚集索引进行查询?主键是索引,不是吗?
另外,如果我在两列上有一个聚合主键,我是否需要在这两列上创建索引以进行查询?
最后,如果我通常会查询指定两列匹配的行,那么最好有一个包含两列的索引吗?还是两个单独的索引,每个索引一个?
答案 0 :(得分:3)
创建主键时,会自动创建聚簇索引。如果此列上有任何JOINS或WHERE条件,则JOIN和搜索更快,因为引擎会知道您要查找的记录的物理位置。
在您的情况下,我会说如果您有一个主键,它是多个列的组合,您将在单个列上搜索/加入,您需要一个非聚集索引。为此分配一个主键将执行特技
有关详细信息,请参阅此处:https://www.simple-talk.com/sql/performance/tune-your-indexing-strategy-with-sql-server-dmvs/
答案 1 :(得分:1)
当我在列上有主键时,是否还需要在同一列上使用非聚集索引进行查询?主键是索引,不是吗?
常规索引是一个(或多个)列的排序副本。排序后可以快速搜索。如果其基础值发生变化,则会相应地重新排序,但物理表顺序保持不变。
另一方面,集群索引定义了物理表顺序。这就是为什么你只能拥有一个 - 如果它的值发生变化,整个表格将相应地重新排序。
主键通常也是表的聚簇索引。但不一定 - 主键的定义属性是它的唯一性。
在同一列上具有聚簇索引和非聚簇索引是多余的,您不应该这样做。它在插入/更新/删除期间增加了工作量,但它对查询性能没有任何作用。
如果我在两列上有一个聚合主键,我是否需要在这两列上创建索引以进行查询?
这取决于您是否想要自己查询第二列。 (A,B)上的索引对于仅搜索B的查询不起任何作用,因此在这种情况下需要在B上设置第二个索引。
在索引中包含要从查询返回的任何额外列。如果设置得很巧妙,单独使用索引就可以满足查询,从而使数据库引擎不必查看表格。
请注意,这适用于非聚集索引。不需要包含用于针对聚簇索引的查询的额外列,因为聚簇索引是表。它自然包含所有列。
如果我通常会查询指定要匹配的两列的行,那么最好有一个包含两列的索引吗?还是两个单独的索引,每个索引一个?
包含两个列的单个索引,最具选择性(唯一值的最大差异)或您最有可能首先查询的一个,辅助值秒。有时需要两种方式 - (A,B)和(B,A),这完全取决于表格的使用方式。