为啥在sql server中每张表只能创建一个聚集索引?

Posted

技术标签:

【中文标题】为啥在sql server中每张表只能创建一个聚集索引?【英文标题】:Why only one clustered index per table should be created in sql server?为什么在sql server中每张表只能创建一个聚集索引? 【发布时间】:2014-02-22 18:49:20 【问题描述】:

我在http://www.sql-server-performance.com/2007/clustered-indexes阅读了关于sql server 数据库的提示

结论部分作者提到: “由于每个表只能创建一个聚集索引,因此需要额外的时间仔细考虑如何使用它。”

我的问题是:

*为什么在 sql server 中每个表只能创建一个聚集索引? *

【问题讨论】:

因为物理上不可能根据两个不同的顺序来订购一张桌子。更多信息在这里:use-the-index-luke.com/blog/2014-01/… 这适用于大多数 DBMS 这个问题似乎离题了,因为 OP 没有表现出任何研究工作。 这能回答你的问题吗? What do Clustered and Non clustered index actually mean? 【参考方案1】:

聚集索引: 聚集索引定义了数据在磁盘上的物理排序方式。 只有一种方式可以对数据进行物理排序。 因此,每个表只能有一个聚集索引。

为什么要关心聚集索引? 如果我们在表上放置聚集索引,那么数据检索速度会更快,因为 sql server 不必读取整个数据——取决于查询。 但是数据检索要快得多。

注意:虽然您可以在单个表上创建多个非聚集索引。

【讨论】:

为什么当我在 [dbo].[Customer] ([CustomerId]) 上创建 CREATE CLUSTERED INDEX [CustomerIdIndex] 时;在 [dbo].[Customer] ([CustomerGuid]) 上创建非聚集索引 [CustomerGuidIndex];我收到一个错误,上面说表上的聚集索引不止一个。我不明白为什么当我清楚地拥有每种类型的索引 1 时它会这样说。【参考方案2】:

这只是 SQL Server 的实施决策。理论上,可以有任意数量的集群索引。 MongoDB 和 MyISAM 没有集群索引,将数据存储在一个平面文件中。 InnoDB for mysql 有一个聚簇索引,即主键,如果未声明主键,它可能会被隐藏。 TokuDB for MySQL 和 TokuMX(我都在研究这两个)允许用户拥有多个集群索引,隐含的权衡是将更多磁盘空间用于更快的查询。

【讨论】:

【参考方案3】:

因为聚集索引是表中数据写入磁盘时的排序方式。换句话说,聚集索引就是表。

这也是您不能在聚集索引上指定包含列的原因 - 因为从本质上讲,所有列都已包含在内。

【讨论】:

添加一个可能有用的比较:想象一本书末尾的索引和字典之间的区别。书末的索引与书不同:它是一个非聚集索引。在字典中,索引是书籍的一部分,整本书都是由该索引组织的,它是一个聚集索引。字典中只能有一个订单。【参考方案4】:

聚集索引根据索引键值对表中的数据行进行排序和存储。因此,每个表只能创建一个聚集索引,因为数据行本身只能按一种顺序排序。

要在同一个表上创建不同的聚集索引,请在创建第二个索引之前更改现有聚集索引的Create as Clustered 属性设置。

【讨论】:

【参考方案5】:

你可以! (间接)

如果您需要一个表上的多个聚集索引,您可以在该表上创建indexed view。但同时,您应该知道聚集索引总是有其成本。

【讨论】:

【参考方案6】:

聚集索引决定了表中数据的物理顺序,就像一个家庭地址,这就是为什么我们应该只有一个家庭地址,如果不是邮递员会混淆。

http://msdn.microsoft.com/en-us/library/aa933131.aspx

【讨论】:

以上是关于为啥在sql server中每张表只能创建一个聚集索引?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server查询优化和事务处理

sqlserver的索引

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

《Pro SQL Server Internals》——CHAPTER2 节 (P36-P45) 翻译

SQL Server 使用没有主键的聚集索引创建表

SQL Server 2016新特性:列存储索引新特性