Операция онлайн не может быть выполнена для индекса

Я пытаюсь 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?

0 ответов

Другие вопросы по тегам