如果一个表只需要 1 个索引,那么集群似乎通常是可行的方法。它速度更快,因为它不必通过键引用回数据,而且它也不像非聚集索引那样占用磁盘空间。
我的问题是关于多个索引,是否一起删除聚簇索引更好?这背后的逻辑是,如果您有带聚集索引的非聚集索引,它们不再直接引用实际数据行,而是引用聚集索引。因此,使用聚簇索引作为代理似乎会对性能产生重大影响。如果您认为表上需要超过 1 个索引,那么最好的办法似乎是根本不使用聚簇索引。
最佳答案
如果表有适当的聚簇索引,则删除它没有任何好处。
如果您有多个索引,请选择最佳的集群索引。
通常是你的PK。
默认情况下,当您创建 PK 时,它会集群。
PK 是集群的最佳候选,除非您有特定理由不使用它。
我不同意你的说法。
"If you have non clustered indexes WITH a clustered index, they don't refer back to the actual data rows anymore, but to the clustered index instead. So it seems like there would be a significant performance hit."
如果聚簇索引在数据中,那么引用聚簇索引就是引用数据。数据按聚集索引进行物理组织。显着的性能下降在哪里?
Clustered Index Design Guidelines
With few exceptions, every table should have a clustered index defined
如果那几个异常之一是另一个索引,那么它将被调用。
另一个非聚集索引不是没有聚集索引的理由。
非聚集索引行中的行定位器是指向行的指针或行的聚集索引键,如下所述:
- 如果表是堆表,表示它没有聚簇 索引,行定位器是指向该行的指针。建立指针 来自文件标识符 (ID)、页码和行号 这一页。整个指针称为行 ID (RID)。
- 如果表有聚簇索引,或者索引在索引上 View ,行定位符是该行的聚簇索引键。如果 聚集索引不是唯一索引,SQL Server 使任何重复 通过添加称为 a 的内部生成值来唯一键 唯一性。这个四字节的值对用户是不可见的。它只是 需要时添加以使聚集键唯一以供使用 非聚集索引。 SQL Server通过搜索获取数据行 使用存储在叶中的聚簇索引键的聚簇索引 非聚集索引的行。
即使有 PK,他们也可以选择使用 RID。为什么您认为聚簇索引较慢?
关于sql-server - 索引性能,集群与非集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468742/