2020-11-09

SQL Server 索引碎片整理

索引碎片整理的四种方法:

1)删除索引并重建

2)使用 DROP_EXISTING 语句重建索引

3)使用 ALTER INDEX REBUILD 语句重建索引

4)使用 ALTER INDEX REORGANIZE 重新组织索引

--1.查看碎片SELECT DB_NAME() AS DatbaseName ,  SCHEMA_NAME(o.Schema_ID) AS SchemaName ,  OBJECT_NAME(s.[object_id]) AS TableName ,  i.name AS IndexName ,  ROUND(s.avg_fragmentation_in_percent, 2) AS [Fragmentation %] ,  CASE WHEN avg_fragmentation_in_percent > 30 THEN '严重碎片,索引需要重建'    WHEN avg_fragmentation_in_percent >= 5     AND avg_fragmentation_in_percent < 30 THEN '轻度碎片,索引需要重新组织'    ELSE '正常状态'  END 提示FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) s  INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id  INNER JOIN sys.objects o ON i.object_id = O.object_idORDER BY [Fragmentation %] DESC --2.整理碎片(建议在空闲时间运行,尤其不要在生产环境运行)SET NOCOUNT ONDECLARE @Objectid INT , @Indexid INT , @schemaname VARCHAR(100) , @tablename VARCHAR(300) , @ixname VARCHAR(500) , @avg_fip FLOAT , @command VARCHAR(4000)DECLARE IX_Cursor CURSORFOR SELECT A.object_id ,   A.index_id ,   QUOTENAME(SS.NAME) AS schemaname ,   QUOTENAME(OBJECT_NAME(B.object_id, B.database_id)) AS tablename ,   QUOTENAME(A.name) AS ixname ,   B.avg_fragmentation_in_percent AS avg_fip FROM sys.indexes A   INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL,              NULL, 'LIMITED') AS B ON A.object_id = B.object_id                AND A.index_id = B.index_id   INNER JOIN SYS.OBJECTS OS ON A.object_id = OS.object_id   INNER JOIN sys.schemas SS ON OS.schema_id = SS.schema_id WHERE B.avg_fragmentation_in_percent > 10   AND B.page_count > 20   AND A.index_id > 0   AND A.IS_DISABLED <> 1   --AND OS.name='book'ORDER BY avg_fip DESC ,   tablename ,   ixnameOPEN IX_CursorFETCH NEXT FROM IX_Cursor INTO @Objectid, @Indexid, @schemaname, @tablename, @ixname, @avg_fipWHILE @@FETCH_STATUS = 0  BEGIN   --碎片率>5%或<=30%,索引重组  IF @avg_fip < 30.0    SET @command = N'ALTER INDEX ' + @ixname + N' ON ' + @schemaname    + N'.' + @tablename + N' REORGANIZE ';      --碎片率>=30%,索引重建  IF @avg_fip >= 30.0   AND @Indexid = 1    BEGIN    IF EXISTS ( SELECT *       FROM SYS.columns       WHERE OBJECT_ID = @Objectid         AND max_length IN ( -1, 16 ) )      SET @command = N'ALTER INDEX ' + @ixname + N' ON '      + @schemaname + N'.' + @tablename + N' REBUILD ';    ELSE      SET @command = N'ALTER INDEX ' + @ixname + N' ON '      + @schemaname + N'.' + @tablename + N' REBUILD '      + N' WITH (ONLINE = ON)';   END  IF @avg_fip >= 30.0   AND @Indexid > 1    BEGIN     IF EXISTS ( SELECT *       FROM SYS.index_columns IC         INNER JOIN SYS.columns CS ON CS.OBJECT_ID = IC.OBJECT_ID                AND CS.column_id = IC.column_id       WHERE IC.OBJECT_ID = @Objectid         AND IC.index_id = @Indexid         AND CS.max_length IN ( -1, 16 ) )      SET @command = N'ALTER INDEX ' + @ixname + N' ON '      + @schemaname + N'.' + @tablename + N' REBUILD ';    ELSE      SET @command = N'ALTER INDEX ' + @ixname + N' ON '      + @schemaname + N'.' + @tablename + N' REBUILD '      + N' WITH (ONLINE = ON)';   END  --打印命令,单独执行  PRINT @command    --直接执行命令  --EXEC(@command)   FETCH NEXT FROM IX_Cursor INTO @Objectid, @Indexid, @schemaname,@tablename, @ixname, @avg_fip END CLOSE IX_CursorDEALLOCATE IX_Cursor 

 

原文转载:http://www.shaoqun.com/a/489513.html

sgshop:https://www.ikjzd.com/w/1982

粉丝通:https://www.ikjzd.com/w/743

livingsocial:https://www.ikjzd.com/w/714.html


索引碎片整理的四种方法:1)删除索引并重建2)使用DROP_EXISTING语句重建索引3)使用ALTERINDEXREBUILD语句重建索引4)使用ALTERINDEXREORGANIZE重新组织索引--1.查看碎片SELECTDB_NAME()ASDatbaseName,SCHEMA_NAME(o.Schema_ID)ASSchemaName,OBJECT_NAME(s.[object_id]
netporter:https://www.ikjzd.com/w/2132
shirley:https://www.ikjzd.com/w/1684
长隆水上乐园闭园时间?广州长隆水上乐园什么时候闭园?:http://tour.shaoqun.com/a/19234.html
情人节快到了,深圳哪里有适合情侣去玩的地方啊?:http://tour.shaoqun.com/a/39757.html
日本跨境电商新平台Starday面向中国卖家招商,前6个月0佣金 :https://www.ikjzd.com/home/104400

No comments:

Post a Comment