我在http://www.sql-server-performance.com/2007/clustered-indexes
上阅读了有关sql server数据库的提示最后一节作者提到: “由于每个表只能创建一个聚簇索引,因此请花些额外时间仔细考虑如何使用它。”
我的问题是:
* 为什么在sql server中只能创建每个表的一个聚簇索引? *
答案 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)
聚集索引确定表中数据的物理顺序,就像一个家庭地址,这就是为什么我们应该只有一个家庭地址,如果不是邮递员感到困惑。