我有一个在表上创建聚集索引和非聚集索引以进行分区交换的过程。我遇到的问题是创建聚集索引大约需要 2 分钟:
CREATE UNIQUE CLUSTERED INDEX UCX_Idx ON myTable (
IdCol1 ASC
,Col2 ASC
,IdCol4 ASC
,IdCol3 ASC
,Col1 ASC
,Col6 ASC
) ON PS_1 (IdCol1) END
但是非聚集索引的创建大约需要 1.5 小时:
CREATE NONCLUSTERED INDEX IX_Idx1 ON myTable (
IdCol1 ASC
,IdCol2 ASC
,IdCol3 ASC
,IdCol4 ASC
,Col1 ASC
) INCLUDE (
Col2
,DateCol1
,Col2
,Col3
,Col4
,Col5
,Col6
)
WITH (SORT_IN_TEMPDB = ON) ON PS_1(IdCol1) END
我在 SQL Server 2014 中没有看到这种行为,但我在 SQL Server 2016 中看到了。相同数量的 RAM 和 CPU。我已经在没有 SORT_IN_TEMPDB = ON 的情况下尝试过,但它也有类似的问题。实际上,我已经在我的环境中的不同地方看到了这一点,并且都安装了 SQL Server 2016(标准版)。
开放式问题
聚集索引创建
当您创建聚集索引时,实际上是按照您正在创建的聚集索引的顺序对表中的数据进行排序。
参考:非聚集索引中的聚集索引键列(Brentozar.com)
非聚集索引创建
聚簇索引的列顺序与非聚簇索引中的列顺序完全不同,直接影响索引的创建。数据库引擎必须多次搜索您的聚集索引,直到它以正确的顺序将所有信息组合在一起以创建非聚集索引。这就是为什么创建非聚集索引需要这么长时间的原因。
然后是聚集索引始终是非聚集索引的一部分的开销。
SQL Server 2014 和 SQL Server 2016 之间的差异
至于各个版本在索引创建上的差异:您真的将苹果与苹果进行比较,而不是与梨进行比较吗?或者换一种说法:SQL Server 2014 服务器是否运行在具有相同 CPU 核心频率、相同数量的 RAM 和相同 MAX_DOP 设置的相同硬件上?
使用标准版或企业版时,索引创建存在一些限制/限制...
企业版与标准版
参考:配置并行索引操作(Microsoft Docs)
如果您随后快速浏览了 SQL Server 2014 和 2016 的功能,那么这两个版本都限制了标准版的 MAXDOP:
SQL Server 2014 - SQL Server 2016 的版本和支持的功能 - RDBMS 可管理性
参考:SQL Server 2014 版本支持的功能(Microsoft Docs)
SQL Server 2016 - SQL Server 2016 的版本和支持的功能 - RDBMS 可管理性
参考:SQL Server 2014 版本支持的功能(Microsoft Docs)
此选项对索引创建有直接影响,这可能是您看到索引创建时间差异很大的原因。
想法
您可能需要考虑重新设计索引。我建议阅读以下一些文章:
附加阅读