reindex是比较好的选择,速度快,但是他不能在线操作

INDEXDEFRAG 比较慢,但是可以在线操作

rebuild建议在碎片较少时采用。


附上微软的重建索引脚本,从里面也可以看出微软根据碎片大小推荐的方式,不过这个要随每个不同的数据库而定。

SQL索引碎片整理脚本_百度-- ensure a USE <databasename> statement has been executed first.

SQL索引碎片整理脚本_sed_02SET NOCOUNT ON;

SQL索引碎片整理脚本_sed_03DECLARE @objectid int;

SQL索引碎片整理脚本_百度_04DECLARE @indexid int;

SQL索引碎片整理脚本_sed_05DECLARE @partitioncount bigint;

SQL索引碎片整理脚本_语法错误_06DECLARE @schemaname sysname;

SQL索引碎片整理脚本_sed_07DECLARE @objectname sysname;

SQL索引碎片整理脚本_数据库_08DECLARE @indexname sysname;

SQL索引碎片整理脚本_语法错误_09DECLARE @partitionnum bigint;

SQL索引碎片整理脚本_sed_10DECLARE @partitions bigint;

SQL索引碎片整理脚本_百度_11DECLARE @frag float;

SQL索引碎片整理脚本_查询分析器_12DECLARE @command varchar(8000);

SQL索引碎片整理脚本_语法错误_13-- ensure the temporary table does not exist

SQL索引碎片整理脚本_sed_14IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')

SQL索引碎片整理脚本_查询分析器_15    DROP TABLE work_to_do;

SQL索引碎片整理脚本_查询分析器_16-- conditionally select from the function, converting object and index IDs to names.

SQL索引碎片整理脚本_语法错误_17SELECT

SQL索引碎片整理脚本_sed_18    object_id AS objectid,

SQL索引碎片整理脚本_百度_19    index_id AS indexid,

SQL索引碎片整理脚本_sed_20    partition_number AS partitionnum,

SQL索引碎片整理脚本_sed_21    avg_fragmentation_in_percent AS frag

SQL索引碎片整理脚本_sed_22INTO work_to_do

SQL索引碎片整理脚本_百度_23FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')

SQL索引碎片整理脚本_sed_24WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;

SQL索引碎片整理脚本_数据库_25-- Declare the cursor for the list of partitions to be processed.

SQL索引碎片整理脚本_查询分析器_26DECLARE partitions CURSOR FOR SELECT * FROM work_to_do;

SQL索引碎片整理脚本_查询分析器_27

SQL索引碎片整理脚本_查询分析器_28-- Open the cursor.

SQL索引碎片整理脚本_数据库_29OPEN partitions;

SQL索引碎片整理脚本_sed_30

SQL索引碎片整理脚本_百度_31-- Loop through the partitions.

SQL索引碎片整理脚本_语法错误_32FETCH NEXT

SQL索引碎片整理脚本_查询分析器_33   FROM partitions

SQL索引碎片整理脚本_百度_34   INTO @objectid, @indexid, @partitionnum, @frag;

SQL索引碎片整理脚本_数据库_35

SQL索引碎片整理脚本_数据库_36WHILE @@FETCH_STATUS = 0

SQL索引碎片整理脚本_查询分析器_37    BEGIN;

SQL索引碎片整理脚本_sed_38        SELECT @objectname = o.name, @schemaname = s.name

SQL索引碎片整理脚本_sed_39        FROM sys.objects AS o

SQL索引碎片整理脚本_sed_40        JOIN sys.schemas as s ON s.schema_id = o.schema_id

SQL索引碎片整理脚本_语法错误_41        WHERE o.object_id = @objectid;

SQL索引碎片整理脚本_sed_42

SQL索引碎片整理脚本_查询分析器_43        SELECT @indexname = name 

SQL索引碎片整理脚本_百度_44        FROM sys.indexes

SQL索引碎片整理脚本_语法错误_45        WHERE  object_id = @objectid AND index_id = @indexid;

SQL索引碎片整理脚本_数据库_46

SQL索引碎片整理脚本_数据库_47        SELECT @partitioncount = count (*) 

SQL索引碎片整理脚本_数据库_48        FROM sys.partitions

SQL索引碎片整理脚本_百度_49        WHERE object_id = @objectid AND index_id = @indexid;

SQL索引碎片整理脚本_数据库_50

SQL索引碎片整理脚本_查询分析器_51-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding

SQL索引碎片整理脚本_数据库_52IF @frag>5 AND @frag <= 30.0

SQL索引碎片整理脚本_sed_53    BEGIN;

SQL索引碎片整理脚本_数据库_54    SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REORGANIZE';

SQL索引碎片整理脚本_数据库_55    IF @partitioncount > 1

SQL索引碎片整理脚本_sed_56        SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);

SQL索引碎片整理脚本_语法错误_57    EXEC (@command);

SQL索引碎片整理脚本_查询分析器_58    END;

SQL索引碎片整理脚本_语法错误_59

SQL索引碎片整理脚本_语法错误_60IF @frag > 30.0

SQL索引碎片整理脚本_数据库_61    BEGIN;

SQL索引碎片整理脚本_sed_62    SELECT @command = 'ALTER INDEX ' + @indexname +' ON ' + @schemaname + '.' + @objectname + ' REBUILD';

SQL索引碎片整理脚本_语法错误_63    IF @partitioncount > 1

SQL索引碎片整理脚本_查询分析器_64        SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);

SQL索引碎片整理脚本_数据库_65    EXEC (@command);

SQL索引碎片整理脚本_语法错误_66    END;

SQL索引碎片整理脚本_百度_67PRINT 'Executed ' + @command;

SQL索引碎片整理脚本_查询分析器_68

SQL索引碎片整理脚本_sed_69FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;

SQL索引碎片整理脚本_数据库_70END;

SQL索引碎片整理脚本_数据库_71-- Close and deallocate the cursor.

SQL索引碎片整理脚本_查询分析器_72CLOSE partitions;

SQL索引碎片整理脚本_数据库_73DEALLOCATE partitions;

SQL索引碎片整理脚本_sed_74

SQL索引碎片整理脚本_sed_75-- drop the temporary table

SQL索引碎片整理脚本_数据库_76IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')

SQL索引碎片整理脚本_查询分析器_77    DROP TABLE work_to_do;

SQL索引碎片整理脚本_数据库_78GO


如果提示     '(' 附近有语法错误,则将上面的 DB_ID() 这个改成当前库的ID (当前库的ID,你可以用查询分析器 SELECTDB_ID() 查询出来)


BOL的推荐:



> 5% 且 < = 30%

ALTER INDEX REORGANIZE

> 30%

ALTER INDEX REBUILD WITH (ONLINE = ON)*