单个表上的多个聚簇索引?

时间:2018-04-17 16:18:22

标签: sql-server

我认为我们只能在一个表上放置一个聚簇索引,并在表上放置多个非聚簇索引,但使用下面的代码我可以轻松地向表中添加多个聚簇索引。

CREATE CLUSTERED INDEX TBL_MULTI_LC_HIST ON dbo.TBL_MULTI_LC_HIST (ID,AsOfDate) 

这完全错了吗?

2 个答案:

答案 0 :(得分:5)

不可能为单个表创建多个聚簇索引。来自the docs(强调我的):

  

聚簇索引根据键值对表或视图中的数据行进行排序和存储。这些是索引定义中包含的列。 每个表只能有一个聚簇索引,因为数据行本身只能存储在一个订单中。

例如,这将失败:

CREATE TABLE Thing
(
    Column1 INT NOT NULL,
    Column2 INT NOT NULL
)

CREATE CLUSTERED INDEX IX1 ON dbo.Thing(Column1)

CREATE CLUSTERED INDEX IX2 ON dbo.Thing(Column2)

错误:

  

无法在表格上创建多个聚集索引' dbo.Thing'。删除现有的聚集索引' IX1'在创造另一个之前。

示例:http://www.sqlfiddle.com/#!18/53a63/1

但是,您可以在其中包含多列的单个索引,这可能是您感到困惑的地方:

CREATE CLUSTERED INDEX IX3 ON dbo.Thing(Column1, Column2)

答案 1 :(得分:1)

您只能有一个聚集索引。 “Clustered”索引是行...它包含所有列。每个其他索引只包含一个指向聚簇行的指针。聚集索引的键默认情况下对行强制执行“排序”。

如果没有聚集索引,那么这些行基本上存储在堆中,没有顺序或结构。