SQL Server 2008中的群集索引

问题描述:

我有一个包含复合主键的表。它创建聚集索引。如果我在WHERE子句中使用该复合主键中的几列,该索引是否仍然有效?或者我必须根据WHERE中使用的列创建新索引?任何帮助,将不胜感激。SQL Server 2008中的群集索引

任何索引(无论是否为聚簇)只对查询有用,只要它的定义中最左边的列都是WHERE子句的一部分即可。

如果您有(Col1,Col2,Col3)索引,那么这个指数可以为所有使用3列,或Col2Col1,或者只是Col1 WHERE子句有用。但只要Col1不是包含在搜索中,索引就没用了。

+0

这可能是一个COL1,COL3搜索,但情况因人而异有用。我想添加那么WHERE子句顺序无关紧要,所以col1,col2与col2相同,col1 * only *在WHERE子句中尽管... +1也是 – gbn 2011-05-19 14:29:48

+0

非常感谢您的所有答案。很好的帮助。顺便说一句,YMMV是什么? – 2011-05-19 15:08:59

+0

@gmail用户 - 您的里程可能会有所不同 - 这是一种表明您提供的建议在您的特定情况/环境中可能正确也可能不正确的方式,因此建议您在依赖真实数据/查询之前对其进行测试就像是真实的。 – 2011-05-19 15:48:33

如果有可能,我尽量避免组合键 - 特别是主键。另外:如果您有复合键,则只有在使用最左边的n列时才有效。如果您的组合键中的第三个位置有一列,并且您的搜索仅在该第三列上有WHERE,则索引将无法使用。

聚类键理想情况下是一个小的,稳定的,唯一且不断增长的列 - INT或BIGINT作为默认选项。不要超载您的群集密钥!不要过于宽泛,并且尽量避免使用不同大小的列(如VARCHAR - 它们会带来额外开销)

还有一个问题需要考虑:表中的集群键将被添加到每个列以及桌面上每个非聚集索引中的每个条目 - 因此您确实希望确保它尽可能小。通常情况下,具有超过250亿行的INT应该足以满足绝大多数表的要求 - 并且与GUID作为集群密钥相比,您可以为磁盘和服务器内存节省数百兆的存储空间。

还有一些值得思考的东西 - 金伯利特里普的优秀作品 - 读它,再读一遍,消化它!这真是SQL Server索引福音书。