SQL 服务器 table 中的聚集索引与非聚集索引
Clustered versus nonclustered index in a SQL Server table
在数据仓库环境 (SQL Server 2008) 中工作,有几个表大约有 200 万行和 20 列。每天晚上,表格都会被删除并重新创建。制作它们时,也会构建索引。由于某种原因,这些表上没有聚簇索引。但是,有唯一的非聚集索引。似乎不合逻辑。有没有人知道更改所有这些表以便所有这些表都具有聚集索引的任何缺点。应该节省一些 space 并表现得更好。
有什么建议吗?
提前致谢。
确实聚簇索引也有缺点。
我认为最被低估的缺点是我所说的聚簇索引惩罚。
如果在 table 上没有 any 聚簇索引,则意味着 table 存储为 堆table。所有非聚集索引都引用该堆table。
堆 tables 的好处是存储在其中的行几乎不会移动 — 不像聚簇索引,其中每一行都可以随时移动到不同的物理位置。
这种差异会影响非聚集索引,因为它们引用堆或聚集索引中的行:在堆的情况下,它们可以只存储该行在非聚集索引中的物理位置(因为它们几乎从不改变)。如果有聚簇索引,非聚簇索引存储聚簇键。
如果您最终使用非聚集索引,那么在堆或聚集索引中达到实际 table 的努力是非常不同的:使用堆,您只需要一个物理 IO,使用一个聚簇索引,你需要做一个聚簇索引查找,这通常是 3-5 逻辑 IOs (取决于 table 大小)。
如果您有许多非聚簇索引并且在没有 仅索引扫描 的情况下使用它们(这意味着遵循 RID 访问),聚簇索引可能会显着降低性能。
我写的这篇文章中有更多详细信息:
http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key
在数据仓库环境 (SQL Server 2008) 中工作,有几个表大约有 200 万行和 20 列。每天晚上,表格都会被删除并重新创建。制作它们时,也会构建索引。由于某种原因,这些表上没有聚簇索引。但是,有唯一的非聚集索引。似乎不合逻辑。有没有人知道更改所有这些表以便所有这些表都具有聚集索引的任何缺点。应该节省一些 space 并表现得更好。
有什么建议吗?
提前致谢。
确实聚簇索引也有缺点。
我认为最被低估的缺点是我所说的聚簇索引惩罚。
如果在 table 上没有 any 聚簇索引,则意味着 table 存储为 堆table。所有非聚集索引都引用该堆table。
堆 tables 的好处是存储在其中的行几乎不会移动 — 不像聚簇索引,其中每一行都可以随时移动到不同的物理位置。
这种差异会影响非聚集索引,因为它们引用堆或聚集索引中的行:在堆的情况下,它们可以只存储该行在非聚集索引中的物理位置(因为它们几乎从不改变)。如果有聚簇索引,非聚簇索引存储聚簇键。
如果您最终使用非聚集索引,那么在堆或聚集索引中达到实际 table 的努力是非常不同的:使用堆,您只需要一个物理 IO,使用一个聚簇索引,你需要做一个聚簇索引查找,这通常是 3-5 逻辑 IOs (取决于 table 大小)。
如果您有许多非聚簇索引并且在没有 仅索引扫描 的情况下使用它们(这意味着遵循 RID 访问),聚簇索引可能会显着降低性能。
我写的这篇文章中有更多详细信息:
http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key