无法重建索引,但没有理由不?

Aar*_*son 6 sql-server-2008 clustered-index t-sql

我创建了一个过程,我只能重建需要重建的索引(如果我重建它们,这个过程需要一个半小时),虽然它运行良好,但它卡在一个特定的索引上,我看不到我应该这样做的原因。

它失败并显示以下消息:

消息 2725,级别 16,状态 2,第 1 行

无法对索引“I_520CUSTVENDRELIDX”执行联机操作,因为该索引包含数据类型为 text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml 或 large CLR 类型的列“MEMO”。对于非聚集索引,该列可以是索引的包含列。对于聚集索引,该列可以是表的任何列。如果使用 DROP_EXISTING,则该列可能是新索引或旧索引的一部分。该操作必须离线执行。

但是,当我根据这个 chap的建议运行查询时,如下所示,我没有得到任何结果:

SELECT *
FROM sys.index_columns AS ic
INNER JOIN sys.columns AS c
ON ic.object_id = c.object_id
AND ic.column_id = c.column_id
AND ((c.system_type_id IN (34,35,99,241)) -- image, text, ntext, xml
 OR (c.system_type_id IN (167,231,165) -- varchar, nvarchar, varbinary
     AND max_length = -1))
INNER JOIN sys.indexes as si
on si.object_id = ic.object_id
AND ic.index_id = si.index_id
inner join sys.tables t
on t.object_id = ic.object_id
where t.name = 'CONTACTPERSON'
and si.name = 'I_520CUSTVENDRELIDX'
Run Code Online (Sandbox Code Playgroud)

最重要的是,对相关索引的手动检查显示没有 text、ntext、image、xml 或 varchar(MAX)、nvarchar(MAX) 或 varbinary(MAX)。难道我在这里遗漏了什么?

为了记录,这是一个聚集索引。

Roi*_*ish 8

我跳过了代码示例,并跳到了这里似乎是真正的问题

最重要的是,对相关索引的手动检查显示没有 text、ntext、image、xml 或 varchar(MAX)、nvarchar(MAX) 或 varbinary(MAX)。难道我在这里遗漏了什么?

为了记录,这是一个聚集索引。

你肯定遗漏了一些东西,答案就在错误消息的正文中:

对于聚集索引,列可以是表的任何列

因为Online Index OperationsaClusteredNon-Clustered索引之间存在差异。
两者都可能不包含 BLOB 列以便在线重建,
但是当非聚集索引“包含”其定义中的列(和包含的列)时,
聚集索引“包含”包含所有列的整个表。

在您的情况下,有一列名为MEMOtext、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml 或 large CLR 类型的列。
此列是表的一部分,因此也是聚集索引的一部分。

您的选择是:

  1. REBUILD离线执行操作
  2. 升级到 SQL Server 2012
  3. 更改列的数据类型

执行联机索引操作的指南