当前位置: 代码迷 >> Sql Server >> dbcc showconfit 整理碎片请问下各位
  详细解决方案

dbcc showconfit 整理碎片请问下各位

热度:211   发布时间:2016-04-27 12:26:15.0
dbcc showconfit 整理碎片请教下各位
dbcc showconfit 可以检测索引碎片。
相对于SQL 碎片除了磁盘碎片 还有一个就是索引碎片
SQL 2005 中检测到碎片后 可以直接点击表 打开索引 选择索引 重建索引 这样操作吗?这样可以使碎片去掉吗?

------解决方案--------------------
重建索引比较好,这个很有用的。
------解决方案--------------------
建立一个维护计划,定期整理索引和更新统计信息。
如果你的库比较大,可以几个大表分开在几个job里面执行。
------解决方案--------------------
清理数据库中碎片>10%的分区
SQL code
-- Ensure a USE <databasename> statement has been executed first.SET NOCOUNT ON;DECLARE @objectid int;DECLARE @indexid int;DECLARE @partitioncount bigint;DECLARE @schemaname nvarchar(130); DECLARE @objectname nvarchar(130); DECLARE @indexname nvarchar(130); DECLARE @partitionnum bigint;DECLARE @partitions bigint;DECLARE @frag float;DECLARE @command nvarchar(4000); -- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function -- and convert object and index IDs to names.SELECT    object_id AS objectid,    index_id AS indexid,    partition_number AS partitionnum,    avg_fragmentation_in_percent AS fragINTO #work_to_doFROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;-- Declare the cursor for the list of partitions to be processed.DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;-- Open the cursor.OPEN partitions;-- Loop through the partitions.WHILE (1=1)    BEGIN;        FETCH NEXT           FROM partitions           INTO @objectid, @indexid, @partitionnum, @frag;        IF @@FETCH_STATUS < 0 BREAK;        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)        FROM sys.objects AS o        JOIN sys.schemas as s ON s.schema_id = o.schema_id        WHERE o.object_id = @objectid;        SELECT @indexname = QUOTENAME(name)        FROM sys.indexes        WHERE  object_id = @objectid AND index_id = @indexid;        SELECT @partitioncount = count (*)        FROM sys.partitions        WHERE object_id = @objectid AND index_id = @indexid;-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.        IF @frag < 30.0            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';        IF @frag >= 30.0            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';        IF @partitioncount > 1            SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));        EXEC (@command);        PRINT N'Executed: ' + @command;    END;-- Close and deallocate the cursor.CLOSE partitions;DEALLOCATE partitions;-- Drop the temporary table.DROP TABLE #work_to_do;GO
------解决方案--------------------
探讨

清理数据库中碎片>10%的分区
SQL code
-- Ensure a USE <databasename> statement has been executed first.
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @sche……