SQL Server表中的聚簇与非聚簇索引

时间:2017-11-24 06:30:01

标签: sql-server indexing clustered-index

在数据仓库环境(SQL Server 2008)中工作,有几个表有大约200万行和20列。每晚,表格都会被删除并重新创建。制作它们时,还会构建索引。由于某种原因,这些表上没有聚集索引。但是,有唯一的非聚集索引。似乎不合逻辑。有没有人知道改变这一切的任何缺点,以便所有这些表都有一个聚集索引。应该节省一些空间并且表现更好。

任何提示?

提前致谢。

1 个答案:

答案 0 :(得分:1)

确实聚集索引也存在缺陷。

我认为最低估的缺点是我称之为聚集索引惩罚

如果表上没有任何聚簇索引,则表示该表存储为堆表。所有非聚集索引都引用该堆表。

关于堆表的好处是存储在它们中的行几乎不会移动 - 与聚簇索引不同,其中每行可以随时移动到不同的物理位置。

这种差异会影响非聚集索引,因为它们引用堆或聚簇索引中的行:如果是堆,它们只能将该行的物理位置存储在非聚簇索引中(因为它们几乎没有更改)。如果存在聚簇索引,则非聚簇索引将存储聚类密钥。

如果您最终使用非聚集索引,则在堆或聚簇索引中到达实际表的工作量是非常不同的:使用堆,您只需要一个具有聚簇索引的物理IO,您需要执行Clustered Index Seek,通常是3-5个逻辑IO(取决于表大小)。

如果你有许多非聚集索引,并且在没有仅索引扫描的情况下使用它们(这意味着它遵循RID访问),聚集索引可能会严重影响性能。

我写这篇文章的更多细节:

http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key