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

为什么在sql server中每个表只能创建一个聚集索引?,sql,sql-server,database-administration,Sql,Sql Server,Database Administration,我已经在上阅读了有关sql server数据库的提示 在结论部分,作者提到: “因为您只能为每个表创建一个聚集索引,所以需要花额外的时间仔细考虑它将如何使用。” 我的问题是: *为什么在sql server中每个表只能创建一个聚集索引* 因为聚集索引是表中数据写入磁盘时的排序方式。换句话说,聚集索引就是表 这也是为什么不能在聚集索引中指定包含的列,因为从本质上讲,所有列都已包含在内。聚集索引根据索引键值对表中的数据行进行排序和存储。因此,每个表上只能创建一个聚集索引,因为数据行本身只能按一个顺序

我已经在上阅读了有关sql server数据库的提示

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

我的问题是:


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

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


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

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


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

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

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


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

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


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

你可以!(间接地)


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

因为按照两种不同的顺序点一张桌子实际上是不可能的。这里的更多信息:这适用于大多数DBMS。这个问题似乎离题了,因为OP没有显示出任何研究成果。这回答了你的问题吗?添加一个可能有用的比较:想象一下书尾的索引和字典之间的区别。本书末尾的索引与本书不同:它是一个非聚集索引。在字典中,索引是书的一部分,而整本书是由该索引组织的,它是一个聚集索引。字典中只能有一个顺序。为什么我在[dbo].[Customer]([CustomerId])上创建聚集索引[CustomerIdIndex];在[dbo].[Customer]([CustomerGuid])上创建非聚集索引[CustomerGuidIndex];我得到一个错误,表示表上有多个聚集索引。我不明白为什么它说,当我清楚地有每种类型的索引1。