1

我仍在学习索引的细节,这是我看不到需要的东西。希望社区可以为我指明正确的方向。

该表有 6 个以上的字段。

Field1 是唯一标识符,是 PK。字段 2 和 3 也是唯一标识符。其余的是 varchar/ints,据我所知是无关紧要的。

三个索引已放在表上:Clustered PK Nonclustered Non-Unique on Field2 Nonclustered Non-Unique on Field2 AND Field3

任何索引上都没有包含列。

我的问题是,是否有任何理由在 field2 上有单个索引?我的理解是,如果有两列或一列,索引的查找应该没有区别?

4

4 回答 4

1

定义索引时增加的列(数据)数,意味着索引大小将按比例增加。所以建议在小/整数字段上创建主键(索引)。

例如,假设您在三列上搜索表格

州、县、邮编。

您有时仅按州搜索。您有时会按州和县进行搜索。您经常按州、县、邮编搜索。然后是州、县、邮编的索引。将在所有这三个搜索中使用。

如果您仅通过 zip 进行大量搜索,则将不会使用上述索引(无论如何,SQL Server 都不会使用),因为 zip 是该索引的第三部分,并且查询优化器不会将该索引视为有用。

然后,您可以仅在 Zip 上创建将在此实例中使用的索引。

我想您正在寻找的答案是它取决于您经常使用的查询的 where 子句以及您的 group by。

于 2012-05-14T11:45:44.597 回答
1

你说的对。考虑到 Field2 和 Field3 上的索引的存在以及包含的列相同(即没有)的事实,我认为 Field2 上的索引有用的原因很少:

  1. 确保 Field2 是唯一的(如果它是唯一索引) - 鉴于 Field2 是唯一标识符,这极不可能
  2. 深奥的性能原因(从技术上讲,Field2 上的索引会更小,因此 I/O 负担会更小)。
  3. 深奥的锁定原因

鲟鱼定律表明它可能没有做任何有用的事情,但墨菲定律表明移除它会破坏某些东西。

于 2012-05-14T12:33:44.883 回答
0

Field1 有一个索引,因为它已被命名为主键并且可能具有默认值 newid()。它必须是独一无二的。

Field2 有索引的原因是因为它是一个外键,很可能会在许多 where 子句和内部连接语句中找到。

不知道为什么 Field3 会收到索引,但如果它在任何 where 子句中使用,最好有它。

索引都是关于快速查找信息的。检查您的所有 where 子句并确定适合您个人需求的最佳索引。

于 2012-05-14T12:25:16.527 回答
0

我唯一关心的是如果 Field2 是一个 FK 并且在它所引用的表中进行了删除,优化器是否足够聪明以使用以 Field2 作为第一列的复合索引来检查并确保没有任何内容引用正在被删除。当然,更宽的索引仍然效率较低,因为它每页容纳的行数更少。

唯一的另一件事可能是上升/下降问题,但你没有提到那里的区别。

您可以在删除冗余索引后检查此类操作的执行计划和丢失的索引 DMV。

通常我们总是从 PK、FK 所有索引开始,因此基本的完整性相关操作对于性能来说是可以的;然后添加复合索引以提高读取性能。显然,在这一点上,一些 FK 索引最终是多余的,你最终会陷入这种情况。

于 2012-05-14T13:01:34.743 回答