sql2008 R2 批量整理数据库的索引碎片
    文章作者:恒爱网络 阅读次数:7074 发布时间:2018-12-8
    DECLARE @table_name sysname
    DECLARE @index_name sysname
    DECLARE @syntax sysname
    DECLARE ROY_table CURSOR FOR
    SELECT name FROM sysobjects where xtype = 'u '
    OPEN ROY_table
    FETCH NEXT FROM ROY_table INTO @table_name
    WHILE @@FETCH_STATUS = 0
    BEGIN
    DECLARE ROY_index CURSOR FOR
    select sysindexes.name
    from sysindexes,sysobjects
    where sysobjects.id = sysindexes.id and
    sysobjects.name = @table_name and
    keycnt > 0
    OPEN ROY_index
    FETCH NEXT FROM ROY_index INTO @index_name
    WHILE @@FETCH_STATUS = 0
    BEGIN SELECT @syntax = 'DBCC INDEXDEFRAG (0, '+@table_name+ ', '+ @index_name+ ') '
    EXEC (@syntax)
    PRINT '数据表 '+@table_name + '索引 '++@index_name+ '碎片整理完成 '
    FETCH NEXT FROM ROY_index INTO @index_name
    END
    CLOSE ROY_index
    DEALLOCATE ROY_index
    FETCH NEXT FROM ROY_table INTO @table_name
    END
    CLOSE ROY_table
    DEALLOCATE ROY_table

    ---------------------------------------------------------------------------------------

    'DBCC INDEXDEFRAG(0,''?'')' 中的 0和?号各代表什么意思啊?


    DBCC INDEXDEFRAG
    (
    { 'database_name' | database_id | 0 }
    , { 'table_name' | table_id | 'view_name' | view_id }
    , { 'index_name' | index_id }
    , { partition_number | 0 }
    )
    [ WITH NO_INFOMSGS ]

    'database_name' | database_id | 0 对其索引进行碎片整理的数据库。如果指定 0,则使用当前数据库。数据库名称必须符合有关标识符的规则。'table_name' | table_id | 'view_name' | view_id对其索引进行碎片整理的表或视图。表和视图的名称必须符合有关标识符的规则。'index_name' | index_id要进行碎片整理的索引的 ID 的名称。如果未指定,该语句就对指定表或视图的所有索引进行碎片整理。索引名称必须符合有关标识符的规则。 partition_number | 0 要进行碎片整理的索引的分区号。如果未指定或指定 0,该语句将对指定索引的所有分区进行碎片整理。WITH NO_INFOMSGS 取消严重级别从 0 到 10 的所有信息性消息。