Операция онлайн не может быть выполнена для индекса
Я пытаюсь REBUILD/REORGANIZE индексы на нашем сервере базы данных SQL SERVER 2014 Enterprise. Я написал следующую хранимую процедуру с помощью из Интернета:
USE [ManagementReporter]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[REORGANIZE_TOP_INDEXES_NO_PAGE]
AS
DECLARE @dbname SYSNAME = DB_NAME(),
@schema_name SYSNAME,
@page_count INT,
@table_name SYSNAME,
@index_name SYSNAME,
@avg_fragmentation FLOAT,
@sql NVARCHAR(MAX)
-- Do re-indexing
DECLARE INDEXFRAGMENTATION CURSOR FAST_FORWARD FOR
SELECT DISTINCT TOP 5000 DBSCHEMAS.[NAME] AS 'Schema',
DBTABLES.[NAME] AS 'Table',
DBINDEXES.[NAME] AS 'Index',
INDEXSTATS.AVG_FRAGMENTATION_IN_PERCENT AS 'Frag %',
PAGE_COUNT
FROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL) AS INDEXSTATS
INNER JOIN SYS.TABLES dbtables
ON DBTABLES.[OBJECT_ID] = INDEXSTATS.[OBJECT_ID]
INNER JOIN SYS.SCHEMAS dbschemas
ON DBTABLES.[SCHEMA_ID] = DBSCHEMAS.[SCHEMA_ID]
INNER JOIN SYS.INDEXES AS DBINDEXES
ON DBINDEXES.[OBJECT_ID] = INDEXSTATS.[OBJECT_ID]
AND INDEXSTATS.INDEX_ID = DBINDEXES.INDEX_ID
INNER JOIN SYS.INDEX_COLUMNS AS DBINDEXCOLUMNS
ON DBINDEXCOLUMNS.[OBJECT_ID] = DBINDEXES.[OBJECT_ID]
INNER JOIN SYS.COLUMNS AS DBSYSCOLUMNS
ON DBSYSCOLUMNS.[OBJECT_ID] = DBINDEXCOLUMNS.[OBJECT_ID]
AND DBSYSCOLUMNS.COLUMN_ID = DBINDEXCOLUMNS.COLUMN_ID
WHERE INDEXSTATS.DATABASE_ID = DB_ID()
AND DBINDEXES.NAME IS NOT NULL
AND NOT ( DBSYSCOLUMNS.SYSTEM_TYPE_ID IN ( 34, 35, 99, 173, 241 ) --IMAGE, TEXT, NTEXT, BINARY, XML
OR ( DBSYSCOLUMNS.SYSTEM_TYPE_ID IN ( 165, 167, 231 ) --VARBINARY, VARCHAR, NVARCHAR
AND DBSYSCOLUMNS.MAX_LENGTH = -1 ) )
ORDER BY INDEXSTATS.AVG_FRAGMENTATION_IN_PERCENT DESC
OPEN INDEXFRAGMENTATION
FETCH NEXT FROM INDEXFRAGMENTATION INTO @schema_name,
@table_name,
@index_name,
@avg_fragmentation,
@page_count
WHILE @@FETCH_STATUS = 0
BEGIN
IF @avg_fragmentation > 20 -- ReBuild index
SET @sql = 'ALTER INDEX [' + @index_name + '] ON [' + @schema_name + '].[' + @table_name + '] REBUILD WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION= 20, ABORT_AFTER_WAIT=BLOCKERS)))';
ELSE -- ReOrganize index
SET @sql = 'ALTER INDEX [' + @index_name + '] ON [' + @schema_name + '].[' + @table_name + '] REORGANIZE;';
EXEC (@sql)
FETCH NEXT FROM INDEXFRAGMENTATION INTO @schema_name,
@table_name,
@index_name,
@avg_fragmentation,
@page_count
END
CLOSE INDEXFRAGMENTATION
DEALLOCATE INDEXFRAGMENTATION
Из того, что я прочитал на WEB, я подумал, что если я проигнорирую индексы с указанными выше SYSTEM_TYPE_ID, я подумал, что это не вернет эти индексы в мой набор результатов. Однако следующий индекс все еще выбирается и выдает следующую ошибку:
Сообщение 2725, уровень 16, состояние 2, строка 3 Не удается выполнить онлайн-операцию для индекса PK_ReportOutput, поскольку в индексе содержится столбец EmailMessage типа данных text, ntext, image или FILESTREAM. Для некластеризованного индекса столбец может быть столбцом включения индекса. Для кластеризованного индекса столбец может быть любым столбцом таблицы. Если используется DROP_EXISTING, столбец может быть частью нового или старого индекса. Операция должна быть выполнена в автономном режиме.
Столбец EmailMessage определен как (ntext, не null), поэтому я не понимаю, почему он выбирается с моим основным SQL выше? Похоже, ntext имеет system_type_id 99, который я исключил.
Вот определение таблицы и индекса, на которые жалуется ошибка:
Я что-то упустил с моим оператором SQL?