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

时间:2014-01-30 12:46:57

标签: sql sql-server database-administration

我在http://www.sql-server-performance.com/2007/clustered-indexes

上阅读了有关sql server数据库的提示

最后一节作者提到: “由于每个表只能创建一个聚簇索引,因此请花些额外时间仔细考虑如何使用它。”

我的问题是:

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

6 个答案:

答案 0 :(得分:12)

聚集指数: 聚簇索引定义数据在磁盘上物理排序的方式。 并且只能有一种方法可以在物理上订购数据。 因此,每个表只能有一个聚簇索引。

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

注意:虽然您可以在一个表上创建多个Non-Clustered索引。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

这也是您无法在聚簇索引上指定包含列的原因 - 因为其性质已包含所有列。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

你可以! (间接地)

如果您需要在表上使用多个聚簇索引,则可以在该表上创建indexed view。但与此同时,您应该意识到聚集索引始终具有成本。

答案 5 :(得分:0)

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

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