我曾以为一个表只能有一个聚集索引,而多个非聚集索引,但是使用以下代码,我可以轻松地向我的表中添加多个聚集索引。
CREATE CLUSTERED INDEX TBL_MULTI_LC_HIST ON dbo.TBL_MULTI_LC_HIST (ID,AsOfDate)
这完全错误吗?
我曾以为一个表只能有一个聚集索引,而多个非聚集索引,但是使用以下代码,我可以轻松地向我的表中添加多个聚集索引。
CREATE CLUSTERED INDEX TBL_MULTI_LC_HIST ON dbo.TBL_MULTI_LC_HIST (ID,AsOfDate)
这完全错误吗?
一张表不能创建多个聚集索引。根据文档(强调是我的):
聚集索引按照其键值对数据行进行排序和存储。这些列被包括在索引定义中。每张表只能有一个聚集索引,因为数据行本身只能按照一个顺序存储。
例如,以下操作将失败:
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)
Column1
也是条件的一部分时才能使用Column2
(但是搜索Column1
时始终可以使用索引,至少如果它不是哈希索引)。 - Masklinn一个表只能有一个聚集索引。聚集索引是行本身...它包含了所有的列。其他的索引只会包含一个指针指向聚集行。聚集索引的键默认会对行进行'排序'。
如果没有聚集索引,则行基本上以堆的方式存储,没有任何顺序或结构。