我是否应该在事实表上创建聚集索引?从不?总是?

4
3个回答

2

我建议在经常按特定值搜索的表(事务或仓库)上建立聚集索引。 聚集索引(或任何索引)的缺点是你正在创建占用空间的额外数据存储。 如果被索引的表很大,那么索引也会很大! 你拥有的索引数量越多,除数据库外,存储的数据就越多。 然而,如果你需要搜索速度,则可能需要索引以帮助提高速度。

但是,你也可以考虑在表的ID上创建聚集索引。 然后,在像Lucene(或Lucene.NET)这样的产品中创建数据库外的索引。 然后,你可以搜索Lucene索引(在搜索方面具有更灵活和功能丰富的特性),该索引将返回给定记录(或记录)的ID,然后你可以使用它来标识你需要在数据库中获取的数据。 这是我们在目前项目中经常使用的一种方法,我必须承认它非常实用! 创建索引要快得多(特别是与使用SQL Server中的全文选项相比)。 只是需要考虑一下。


这真的是额外的存储空间吗?由于它根据索引列排列物理行,我认为它只是数据的重新排列+一些开销,即在B树的该级别上指向其他页面的附加指针。 - Jeff Meatball Yang
2
聚集索引是按照构建索引的列(通常是键,但不总是)排序的相同存储。非聚集索引是对被索引列的额外存储,并带有指向数据引用行的指针。 - Andrew Siemer
7
实际上,聚簇索引就是表中的数据,因此它不需要额外的存储空间。它只是将数据放在树中而不是堆中。就总存储需求而言,根据聚簇索引键是否比堆中用于引用行的物理地址更窄或更宽,聚簇表可能比堆更小或更大。话虽如此,这个答案是正确的——你确实需要为事实表建立聚簇索引。 - onupdatecascade

2

我不喜欢说“总是”和“从不”,但我认为在大多数情况下,将聚集索引用于事实表是一个好的选择。不建议在插入具有随机值的列类型上创建聚集索引。例如,您不希望在GUID之类的东西上创建聚集索引。日期和顺序ID非常适合聚集索引,特别是对于范围查询。

你已经说明了你知道聚集索引的优点,但是缺点将取决于你如何使用它们,以确定它们是否对你有影响。

1.) 每个表只能有一个聚集索引,因为它会更改数据块的布局以匹配索引的顺序。这就是为什么聚集索引非常适合范围查询的原因。

2.) 因为数据块按索引的顺序排列,插入和更新会改变键的顺序,这可能导致对数据块进行物理修改,以使其与索引保持一致。按顺序插入键值可以减轻此缺点。


我刚在网络上做了些挖掘,并发现关于为什么聚簇索引不比非聚簇索引更快地扫描范围的文章:http://blogs.sqlserver.org.au/blogs/greg_linwood/archive/2006/09/11/365.aspx - Jeff Meatball Yang

0
拥有一个自动递增的int(bigint)主键聚集索引可以极大地简化分区操作;而且,早晚事实表也会到达这个点。因此,即使您现在认为可能不需要它,也要创建一个。

但是,合成键不能保证与您的主日期字段以相同的顺序排列,因此无法用于按月份进行分区(例如)。它也不能用于范围扫描。 - user565869

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接