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

4

我曾以为一个表只能有一个聚集索引,而多个非聚集索引,但是使用以下代码,我可以轻松地向我的表中添加多个聚集索引。

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

这完全错误吗?


5
一个表只能有一个聚集索引,但该索引可以包含多个字段。 - James Z
你能否发布表DDL和原始索引语句以展示此问题的复现吗? - S3S
哦,我明白了詹姆斯。好的,很有道理。以下链接非常有信息量,但我没有看到作者解释那个细微差别。https://www.sqlshack.com/what-is-the-difference-between-clustered-and-non-clustered-indexes-in-sql-server/ - ASH
不确定该链接是否详细说明了这一点,但是在此索引语句中列出列的顺序很重要。 - S3S
2个回答

13

一张表不能创建多个聚集索引。根据文档(强调是我的):

聚集索引按照其键值对数据行进行排序和存储。这些列被包括在索引定义中。每张表只能有一个聚集索引,因为数据行本身只能按照一个顺序存储。

例如,以下操作将失败:

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)

如何在多个列上逻辑上实现聚集索引?如何对两个列进行排序?仅当列之间存在唯一值时才能进行排序吗? - Embedded_Mugs
1
@Embedded_Mugs 它在对中进行索引,而不是单独的列。这意味着只有在Column1也是条件的一部分时才能使用Column2(但是搜索Column1时始终可以使用索引,至少如果它不是哈希索引)。 - Masklinn

4

一个表只能有一个聚集索引。聚集索引是行本身...它包含了所有的列。其他的索引只会包含一个指针指向聚集行。聚集索引的键默认会对行进行'排序'。

如果没有聚集索引,则行基本上以堆的方式存储,没有任何顺序或结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接