我仍在学习索引的细节,这是我看不到的需要。希望社区可以指出我正确的方向。
该表有6个以上的字段。
Field1是一个独特的,是PK。 Field2和3也是唯一标识符。 其余的是varchar / int,就我所见而言无关紧要。
表上已放置三个索引: 集群PK Field2上的非聚集非唯一 Field2 AND Field3上的非聚集非唯一
任何索引都没有包含列。
我的问题是,有没有理由在field2上使用单一索引?我的理解是,如果有两列或一列,那么索引的搜索应该没有区别吗?
答案 0 :(得分:1)
定义索引时列(数据)的数量增加,这意味着索引大小将按比例增加。所以建议主键(索引)应该在小/整数字段上创建。
e.g。想象一下你在三列上搜索一个表
州,县,邮编。您有时仅按州搜索。你有时会按州和县搜索。你经常按州,县,邮编搜索。然后是一个带有州,县,拉链的索引。将在所有这三个搜索中使用。
如果您通过zip单独搜索,那么上面的索引将不会被使用(无论如何由SQL Server),因为zip是该索引的第三部分,并且查询优化器不会将该索引视为有用。
然后,您可以单独在Zip上创建一个索引,该索引将在此实例中使用。
我想您正在寻找的答案取决于您经常使用的查询的where子句以及您的分组。
答案 1 :(得分:1)
你是对的。鉴于Field2和Field3上存在索引以及包含的列相同(即无),我可以认为仅仅Field2上的索引有用的原因很少:
Sturgeon's law表明它可能没有做任何有用的事情,但墨菲的法律建议删除它会破坏某些东西。
答案 2 :(得分:0)
Field1有一个索引,因为它已经被命名为主键,并且可能有一个默认值newid()。它必须是独一无二的。
Field2有索引的原因是因为它是一个外键,可能会在很多where子句和内连接语句中找到。
不确定为什么Field3会收到一个索引,但如果它在任何where子句中使用,那么将它放在那里是很好的。
索引就是快速查找信息。检查所有where子句,并根据个人需求确定最佳索引。
答案 3 :(得分:0)
我唯一担心的是,如果Field2是一个FK,并且在它引用的表中完成删除,优化器是否足够聪明,可以使用复合索引和Field2作为第一列来检查并确保没有任何引用要删除的行。当然,较宽的索引效率仍然较低,因为它每页的行数较少。
唯一的另一件事可能是升序/降序问题,但你没有提到差异。
您可以在删除冗余索引后检查此类操作的执行计划和缺少的索引DMV。
通常我们总是从PK开始,FK都被编入索引,因此基本的完整性相关操作对于性能是可以接受的;然后添加复合索引以获得读取性能。显然,在那时,一些FK索引最终会变得多余,最终会出现这种情况。