我听说过您无法对具有 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)
好的,所以文档并不是很出色,但是您必须认为这不应该在线工作,因为文档说:
当表包含 LOB 数据类型但在索引定义中没有将这些列用作键或非键(包含)列时,可以联机创建非唯一非聚集索引。
其中 - 如果您将其反转 - 说明无法在线创建包含 MAX 类型的索引。
现在,我将重点放在了created一词上——这个规定的限制不适用于重建(我想这解释了为什么在那句话中没有明确提到重建)。在您更新的代码示例中,您实际上已经证明了重建和创建,以及在线运行的选项,运行成功并且不返回错误。我已经确认情况确实如此(至少在创建场景中,这与上面的句子冲突)。我也收到了来自微软的确认文档是错误的。
实际上,在下表中(对于2012 doc和2014文档),都列出了重建或创建不支持的索引类型,并且 LOB 类型不再是约束(是否属于基表或包含在正在创建或重建的索引中)。这些是您无法在线重建的唯一索引:
这些是您无法在线创建的唯一索引:
所以这有点像逆向文档 - 您没有遇到问题,并且该文档并没有完全让您相信您应该遇到问题。嗯,不是故意的。我不知道 MSDN 中有一个文档说,“听着哟,当 LOB 列是等式的一部分时,您现在可以在线创建和重建索引!” - 但正如我上面指出的那样,其他人已经在博客上写过。
最后,您是正确的,文档是错误的,就像您尝试执行相同操作时获得的 IntelliSense 工具提示一样 - 它会在索引名称下划线,就好像存在错误一样,即使在执行代码时,它工作成功。点击放大:
创建或重建是否真的在线上发生,我没有测试;只是确认它没有产生错误,因为 IntelliSense(和上面的文档)会让你相信。但是根据上面 Microsoft 和 Remus 的博客,它应该可以按预期工作(忘记文档当前所说的内容)。
我已提交以下 Connect 项目来处理 IntelliSense 问题:
早在 2012 年 6 月,我就根据文档提交了此项目,当时该文档在表中仍有一个条目解释 LOB 类型使在线操作无效。
那个 Connect 项目被标记为固定,因为表格已更正,但我上面突出显示的句子仍然需要修复。我正在等待听到我是否应该请求重新打开我现有的项目(我们过去可以自己做),或者创建一个新项目。当我收到回复时,我会在这里更新。Connect 项已重新打开,主题所有者已收到详细电子邮件。:-)
归档时间: |
|
查看次数: |
2557 次 |
最近记录: |