将额外(精炼)索引添加到SQL Server表

时间:2012-05-14 11:39:04

标签: sql-server indexing

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

该表有6个以上的字段。

Field1是一个独特的,是PK。 Field2和3也是唯一标识符。 其余的是varchar / int,就我所见而言无关紧要。

表上已放置三个索引: 集群PK Field2上的非聚集非唯一 Field2 AND Field3上的非聚集非唯一

任何索引都没有包含列。

我的问题是,有没有理由在field2上使用单一索引?我的理解是,如果有两列或一列,那么索引的搜索应该没有区别吗?

4 个答案:

答案 0 :(得分:1)

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

e.g。想象一下你在三列上搜索一个表

州,县,邮编。

您有时仅按州搜索。你有时会按州和县搜索。你经常按州,县,邮编搜索。然后是一个带有州,县,拉链的索引。将在所有这三个搜索中使用。

如果您通过zip单独搜索,那么上面的索引将不会被使用(无论如何由SQL Server),因为zip是该索引的第三部分,并且查询优化器不会将该索引视为有用。

然后,您可以单独在Zip上创建一个索引,该索引将在此实例中使用。

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

答案 1 :(得分:1)

你是对的。鉴于Field2和Field3上存在索引以及包含的列相同(即无),我可以认为仅仅Field2上的索引有用的原因很少:

  1. 确保Field2是唯一的(如果它是唯一索引) - 假设Field2是唯一标识符,则极不可能
  2. 深奥的性能原因(从技术上讲,Field2上的索引会更小,因此I / O负担会减少。)
  3. 深奥的锁定原因
  4. Sturgeon's law表明它可能没有做任何有用的事情,但墨菲的法律建议删除它会破坏某些东西。

答案 2 :(得分:0)

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

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

不确定为什么Field3会收到一个索引,但如果它在任何where子句中使用,那么将它放在那里是很好的。

索引就是快速查找信息。检查所有where子句,并根据个人需求确定最佳索引。

答案 3 :(得分:0)

我唯一担心的是,如果Field2是一个FK,并且在它引用的表中完成删除,优化器是否足够聪明,可以使用复合索引和Field2作为第一列来检查并确保没有任何引用要删除的行。当然,较宽的索引效率仍然较低,因为它每页的行数较少。

唯一的另一件事可能是升序/降序问题,但你没有提到差异。

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

通常我们总是从PK开始,FK都被编入索引,因此基本的完整性相关操作对于性能是可以接受的;然后添加复合索引以获得读取性能。显然,在那时,一些FK索引最终会变得多余,最终会出现这种情况。