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)。难道我在这里遗漏了什么?
为了记录,这是一个聚集索引。
我跳过了代码示例,并跳到了这里似乎是真正的问题
最重要的是,对相关索引的手动检查显示没有 text、ntext、image、xml 或 varchar(MAX)、nvarchar(MAX) 或 varbinary(MAX)。难道我在这里遗漏了什么?
为了记录,这是一个聚集索引。
你肯定遗漏了一些东西,答案就在错误消息的正文中:
对于聚集索引,列可以是表的任何列
因为Online Index Operations
aClustered
和Non-Clustered
索引之间存在差异。
两者都可能不包含 BLOB 列以便在线重建,
但是当非聚集索引“包含”其定义中的列(和包含的列)时,
聚集索引“包含”包含所有列的整个表。
在您的情况下,有一列名为MEMO
text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml 或 large CLR 类型的列。
此列是表的一部分,因此也是聚集索引的一部分。
您的选择是:
REBUILD
离线执行操作 归档时间: |
|
查看次数: |
6640 次 |
最近记录: |