联机索引重建 LOB 类型

JBo*_*one 6 index sql-server

我听说过您无法对具有 varchar(max) 类型的表执行联机聚集索引重建。对于包含 varchar(max) 类型的非聚集索引,这(正如我所读到的)也应该是正确的。http://msdn.microsoft.com/en-us/library/ms190981.aspx。但是,在证明这一点时(在 SQL2012 和 SQL2014 的两个版本中),我在在线重建这些索引时不会遇到错误。这是文档中的错误吗?

附带说明一下,2008R2 上的在线重建失败。

测试脚本包含在下面...

CREATE TABLE BIGMAX ( X INT IDENTITY(1,1), Y VARCHAR(MAX), FILLER BIT DEFAULT 1, FILLER2 BIT DEFAULT 1);

INSERT INTO BIGMAX ( Y ) SELECT top 1000 replicate('1',10000) from sys.all_columns c , sys.all_columns c2

CREATE CLUSTERED INDEX [CIDX_BIGMAX] ON BIGMAX(X) WITH (ONLINE = ON);

CREATE NONCLUSTERED INDEX [NIDX_BIGMAX_FILLER] ON BIGMAX(FILLER) WITH (ONLINE = ON);

CREATE NONCLUSTERED INDEX [NIDX_BIGMAX_FILLER2] ON BIGMAX(FILLER) INCLUDE (Y) WITH (ONLINE = ON);

ALTER INDEX [CIDX_BIGMAX] ON [dbo].[BIGMAX]
REBUILD WITH (ONLINE = ON);

ALTER INDEX [NIDX_BIGMAX_FILLER] ON [dbo].[BIGMAX]
REBUILD WITH (ONLINE = ON);

ALTER INDEX [NIDX_BIGMAX_FILLER2] ON [dbo].[BIGMAX]
REBUILD WITH (ONLINE = ON);
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 6

好的,所以文档并不是很出色,但是您必须认为这不应该在线工作,因为文档说:

当表包含 LOB 数据类型但在索引定义中没有将这些列用作键或非键(包含)列时,可以联机创建非唯一非聚集索引。

其中 - 如果您将其反转 - 说明无法在线创建包含 MAX 类型的索引。

现在,我将重点放在了created一词上——这个规定的限制不适用于重建(我想这解释了为什么在那句话中没有明确提到重建)。在您更新的代码示例中,您实际上已经证明了重建和创建,以及在线运行的选项,运行成功并且不返回错误。我已经确认情况确实如此(至少在创建场景中,这与上面的句子冲突)。我也收到了来自微软的确认文档是错误的。

实际上,在下表中(对于2012 doc2014文档),都列出了重建或创建不支持的索引类型,并且 LOB 类型不再是约束(是否属于基表或包含在正在创建或重建的索引中)。这些是您无法在线重建的唯一索引:

  • 禁用聚集索引或禁用索引视图
  • XML索引
  • 本地临时表上的索引

这些是您无法在线创建的唯一索引:

  • XML索引
  • 视图上的初始唯一聚集索引
  • 本地临时表上的索引

所以这有点像逆向文档 - 您没有遇到问题,并且该文档并没有完全让您相信您应该遇到问题。嗯,不是故意的。我不知道 MSDN 中有一个文档说,“听着哟,当 LOB 列是等式的一部分时,您现在可以在线创建和重建索引!” - 但正如我上面指出的那样,其他人已经在博客上写过

最后,您是正确的,文档是错误的,就像您尝试执行相同操作时获得的 IntelliSense 工具提示一样 - 它会在索引名称下划线,就好像存在错误一样,即使在执行代码时,它工作成功。点击放大

在此处输入图片说明 创建或重建是否真的在线上发生,我没有测试;只是确认它没有产生错误,因为 IntelliSense(和上面的文档)会让你相信。但是根据上面 Microsoft 和 Remus 的博客,它应该可以按预期工作(忘记文档当前所说的内容)。

我已提交以下 Connect 项目来处理 IntelliSense 问题:

早在 2012 年 6 月,我就根据文档提交了此项目,当时该文档在表中仍有一个条目解释 LOB 类型使在线操作无效。

那个 Connect 项目被标记为固定,因为表格已更正,但我上面突出显示的句子仍然需要修复。我正在等待听到我是否应该请求重新打开我现有的项目(我们过去可以自己做),或者创建一个新项目。当我收到回复时,我会在这里更新。Connect 项已重新打开,主题所有者已收到详细电子邮件。:-)

  • @JBone 为什么会这样?您在创建的哪个位置明确告诉该索引是在线**创建**的?只有您的 **重建** 是在线指定的。我没有看到任何证据表明创建是在网上发生的,是吗? (2认同)
  • @JBone 我已经重现了那个场景,是的,文档(以及 IntelliSense 在工具提示中为您提供的错误消息,即使实际执行成功)似乎与实际行为相冲突。我已向一些 Microsoft 联系人发送了电子邮件,并会在收到更多信息时进行更新。我怀疑这个操作是在 2012 年启用的,其他的在线操作改进,但 IntelliSense 和 Books Online 尚未更新以反映它。 (2认同)