sql-server - 索引性能,集群与非集群

标签 sql-server database optimization indexing

如果一个表只需要 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

如果那几个异常之一是另一个索引,那么它将被调用。
另一个非聚集索引不是没有聚集索引的理由。

Nonclustered Index Structures

非聚集索引行中的行定位器是指向行的指针或行的聚集索引键,如下所述:

  • 如果表是堆表,表示它没有聚簇 索引,行定位器是指向该行的指针。建立指针 来自文件标识符 (ID)、页码和行号 这一页。整个指针称为行 ID (RID)。
  • 如果表有聚簇索引,或者索引在索引上 View ,行定位符是该行的聚簇索引键。如果 聚集索引不是唯一索引,SQL Server 使任何重复 通过添加称为 a 的内部生成值来唯一键 唯一性。这个四字节的值对用户是不可见的。它只是 需要时添加以使聚集键唯一以供使用 非聚集索引。 SQL Server通过搜索获取​​数据行 使用存储在叶中的聚簇索引键的聚簇索引 非聚集索引的行。

即使有 PK,他们也可以选择使用 RID。为什么您认为聚簇索引较慢?

关于sql-server - 索引性能,集群与非集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468742/

相关文章:

c# - NHibernate + SqlServer 全文搜索

sql - 如何列出引用 SQL Server 中给定表的所有外键?

sql-server - 如何避免 Mono ADO.NET 在超时后向请求提供错误结果?

mysql - 查找最近最少使用的 mysql 表索引

javascript - v8 对嵌套函数的优化效果如何?

sql-server - SQL Server - 选择前 2 行

database - 无法以 'postgres' 用户身份登录 'postgres' 数据库

mysql - 如何在 MySQL 数据库中定义一个 append-only 表?

c# - 除了减少内存使用量之外,C# 静态函数是否比非静态函数执行得更好?

C - 数组中最小间隙的递归函数