索引腳本

--創建索引腳本
SELECT [statement] 表名稱,
       'CREATE INDEX [IX_' + SO.name + '_'
       + REPLACE(
                    REPLACE(REPLACE(REPLACE(ISNULL(equality_columns, included_columns), '[', ''), ']', ''), ',', '_'),
                    ' ',
                    ''
                ) + '] ON ' + [statement] + '(' + ISNULL(equality_columns, '')
       + CASE
             WHEN equality_columns IS NOT NULL
                  AND inequality_columns IS NOT NULL THEN
                 ','
             ELSE
                 ''
         END + ISNULL(inequality_columns, '') + ')' + ISNULL(' INCLUDE (' + included_columns + ')', '') AS 索引創建腳本,
       avg_user_impact 收益百分比,
       avg_total_user_cost 減少成本,
       avg_total_user_cost * avg_user_impact * (user_scans + user_seeks) AS 綜合收益
FROM sys.dm_db_missing_index_groups AS G
    INNER JOIN sys.dm_db_missing_index_group_stats AS GS
        ON G.index_group_handle = GS.group_handle
    INNER JOIN sys.dm_db_missing_index_details AS D
        ON G.index_handle = D.index_handle
    INNER JOIN sysobjects AS SO
        ON SO.id = D.object_id
ORDER BY 綜合收益 DESC;



--索引碎片查詢 
SELECT t.name 表名稱,
       i.name 索引名稱,
       s.avg_fragmentation_in_percent 碎片百分比,
       CASE
           WHEN s.avg_fragmentation_in_percent > 30 THEN
               'alter index ' + i.name + ' on dbo.' + t.name + ' rebuild'
           WHEN s.avg_fragmentation_in_percent > 5 THEN
               'alter index ' + i.name + ' on dbo.' + t.name + ' reorganize'
           ELSE
               '無需整理'
       END 碎片整理腳本
FROM sys.tables t
    JOIN sys.indexes i
        ON i.object_id = t.object_id
           AND i.name IS NOT NULL
    INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'limited') s
        ON s.object_id = i.object_id
           AND s.index_id = i.index_id
           AND s.alloc_unit_type_desc = 'IN_ROW_DATA'
ORDER BY 碎片百分比 DESC;

--重建索引
ALTER INDEX PK_Sys_PowerNode ON dbo.Sys_PowerNode REBUILD;

--重新組織索引
ALTER INDEX PK_Sys_PowerNode ON dbo.Sys_PowerNode REORGANIZE;



--使用遊標重新組織指定庫中的索引,消除索引碎片  
SET NOCOUNT ON;
--R_T層遊標取出當前數據庫所有表  
DECLARE R_T CURSOR FOR SELECT name FROM sys.tables;
DECLARE @T VARCHAR(50);
OPEN R_T;
FETCH NEXT FROM R_T
INTO @T;
WHILE @@fetch_status = 0
BEGIN
    --R_index遊標判斷指定表索引碎片情況並優化  
    DECLARE R_Index CURSOR FOR
    SELECT t.name,
           i.name,
           s.avg_fragmentation_in_percent
    FROM sys.tables t
        JOIN sys.indexes i
            ON i.object_id = t.object_id
        JOIN sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(@T), NULL, NULL, 'limited') s
            ON s.object_id = i.object_id
               AND s.index_id = i.index_id;
    DECLARE @TName VARCHAR(50),
            @IName VARCHAR(50),
            @avg INT,
            @str VARCHAR(500);
    OPEN R_Index;
    FETCH NEXT FROM R_Index
    INTO @TName,
         @IName,
         @avg;
    WHILE @@fetch_status = 0
    BEGIN
        IF @avg >= 30 --如果碎片大於30,重建索引  
        BEGIN
            SET @str = 'alter index ' + RTRIM(@IName) + ' on dbo.' + QUOTENAME(RTRIM(@TName)) + ' rebuild';
        END;
        ELSE --如果碎片小於30,重新組織索引  
        BEGIN
            SET @str = 'alter index ' + RTRIM(@IName) + ' on dbo.' + QUOTENAME(RTRIM(@TName)) + ' reorganize';
        END;
        PRINT @str;
        EXEC (@str); --執行  
        FETCH NEXT FROM R_Index
        INTO @TName,
             @IName,
             @avg;
    END;
    --結束r_index遊標  
    CLOSE R_Index;
    DEALLOCATE R_Index;
    FETCH NEXT FROM R_T
    INTO @T;
END;
--結束R_T遊標  
CLOSE R_T;
DEALLOCATE R_T;
SET NOCOUNT OFF;

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章