Sql server 我应该在事实表上创建聚集索引吗?从未?总是吗?

Sql server 我应该在事实表上创建聚集索引吗?从未?总是吗?,sql-server,indexing,data-warehouse,Sql Server,Indexing,Data Warehouse,在数据仓库中,在事实表上创建聚集索引是否有缺点?(大多数情况下,它将位于datetime列上) 您是否会回答“默认…”是或否 如果默认情况下我不应该创建聚集索引,那么为什么?(我知道聚集索引的优点,但有什么缺点?) 参考资料 我总是建议在经常按给定值搜索的表(事务或仓库)上使用聚集索引。聚集索引(或任何索引)的缺点是,您正在创建一个额外的数据存储,这会占用空间。如果被索引的表很大…索引也会很大!索引越多,除数据库外存储的数据越多。但是,如果您需要搜索速度,那么您可能需要索引来帮助提高搜索速度 但

在数据仓库中,在事实表上创建聚集索引是否有缺点?(大多数情况下,它将位于datetime列上)

您是否会回答“默认…”是或否

如果默认情况下我不应该创建聚集索引,那么为什么?(我知道聚集索引的优点,但有什么缺点?)

参考资料


我总是建议在经常按给定值搜索的表(事务或仓库)上使用聚集索引。聚集索引(或任何索引)的缺点是,您正在创建一个额外的数据存储,这会占用空间。如果被索引的表很大…索引也会很大!索引越多,除数据库外存储的数据越多。但是,如果您需要搜索速度,那么您可能需要索引来帮助提高搜索速度

但是,您也可以考虑在表的ID上创建聚集索引。然后在产品(如Lucene(或Lucene.NET))中的数据库外创建索引。然后,您可以搜索Lucene索引(在搜索时,它具有更大的灵活性和功能),该索引将返回给定记录的ID,然后您可以使用该ID识别数据库中所需的数据。这是一个路线,我们已经使用了相当多的在我目前的项目,我必须承认它的工作相当顺利!创建索引的速度要快得多(尤其是与在SQL Server中使用全文选项相比)。我不想总是说,但我想在大多数情况下,你会发现在事实表上使用聚集索引是一件好事。不建议对插入值可以是随机值的列类型创建聚集索引。例如,您不希望在GUID之类的对象上使用聚集索引。日期和顺序ID对于聚集索引非常有用,特别是对于范围查询

您已经说过,您知道聚集索引的优点,但就缺点而言,将真正取决于您如何使用它们,以及它们是否适合您

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


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

具有
int(bigint)
自动增量PK聚集索引大大简化了分区;事实表迟早会到达这一点。因此,即使您认为现在可能不需要它,也要创建一个。

它真的是额外的存储吗?因为它是根据索引列排列物理行,所以我认为这只是数据的重新排列,再加上指向b-树级别的其他页面的额外指针的一些开销。聚集索引是按构建索引的列排序的相同存储(通常是键…但不总是)。非聚集索引是使用指向数据引用行的指针索引的列的附加存储。实际上,聚集索引是表中的数据,因此不是附加存储。它只是将数据放在树中而不是堆中。就总存储需求而言,根据聚集索引键比用于引用堆中的行的物理地址窄还是宽,对表进行群集可能比使用堆小或大。也就是说,这个答案是正确的-您确实需要事实表的聚集索引。我刚刚在互联网上做了一些挖掘,发现了这篇关于为什么聚集索引在扫描范围上不比非聚集索引快的文章:但是合成键不能保证与主日期字段的顺序相同,因此它不能用于按月分区(例如)。它也不能用于范围扫描。