• SQLServer重建所有索引


    1. --EXEC [reBuildIndex]
    2. --网上搜索到的代码,做了少许改动,增加日志输出
    3. ALTER PROC [dbo].[reBuildIndex]
    4. AS
    5. DECLARE @objectid INT;
    6. DECLARE @indexid INT;
    7. DECLARE @partitioncount BIGINT;
    8. DECLARE @schemaname sysname;
    9. DECLARE @objectname sysname;
    10. DECLARE @indexname sysname;
    11. DECLARE @partitionnum BIGINT;
    12. DECLARE @partitions BIGINT;
    13. DECLARE @frag FLOAT;
    14. DECLARE @command VARCHAR(8000);
    15. IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
    16. DROP TABLE work_to_do;
    17. SELECT object_id AS objectid,
    18. index_id AS indexid,
    19. partition_number AS partitionnum,
    20. avg_fragmentation_in_percent AS frag
    21. INTO work_to_do
    22. FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED')
    23. WHERE avg_fragmentation_in_percent > 10.0
    24. AND index_id > 0;
    25. SELECT *
    26. FROM dbo.work_to_do;
    27. DECLARE @count INT;
    28. SELECT @count = COUNT(1)
    29. FROM work_to_do;
    30. PRINT '共计需要处理的索引数量为:' + CAST(@count AS VARCHAR);
    31. DECLARE @begin DATETIME;
    32. SET @begin = GETDATE();
    33. DECLARE partitions CURSOR FOR SELECT * FROM work_to_do;
    34. OPEN partitions;
    35. FETCH NEXT FROM partitions
    36. INTO @objectid,
    37. @indexid,
    38. @partitionnum,
    39. @frag;
    40. WHILE @@FETCH_STATUS = 0
    41. BEGIN;
    42. SELECT @objectname = o.name,
    43. @schemaname = s.name
    44. FROM sys.objects AS o
    45. JOIN sys.schemas AS s
    46. ON s.schema_id = o.schema_id
    47. WHERE o.object_id = @objectid;
    48. SELECT @indexname = name
    49. FROM sys.indexes
    50. WHERE object_id = @objectid
    51. AND index_id = @indexid;
    52. SELECT @partitioncount = COUNT(*)
    53. FROM sys.partitions
    54. WHERE object_id = @objectid
    55. AND index_id = @indexid;
    56. PRINT '正在处理索引 ' + @objectname + ' -> ' + @indexname + ' 碎片率 ' + CAST(@frag AS VARCHAR) + '%';
    57. IF @frag < 30.0
    58. BEGIN;
    59. SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REORGANIZE';
    60. IF @partitioncount > 1
    61. SELECT @command = @command + ' PARTITION=' + CONVERT(CHAR, @partitionnum);
    62. PRINT '正在重新组织...';
    63. EXEC (@command);
    64. END;
    65. IF @frag >= 30.0
    66. BEGIN;
    67. SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REBUILD';
    68. IF @partitioncount > 1
    69. SELECT @command = @command + ' PARTITION=' + CONVERT(CHAR, @partitionnum);
    70. PRINT '正在重新生成...';
    71. EXEC (@command);
    72. END;
    73. FETCH NEXT FROM partitions
    74. INTO @objectid,
    75. @indexid,
    76. @partitionnum,
    77. @frag;
    78. END;
    79. -- Close and deallocate the cursor.
    80. CLOSE partitions;
    81. DEALLOCATE partitions;
    82. PRINT '处理完毕,共计耗时:' + CAST(DATEDIFF(SECOND, @begin, GETDATE()) AS VARCHAR) + '秒';
    83. IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
    84. DROP TABLE work_to_do;

  • 相关阅读:
    DNS劫持案列
    STM32使用串口空闲中断(IDLE)和 DMA接收一串数据流
    ECMAScript6(ES6)基础语法
    保研专业课参考
    PostgreSQL文本搜索(五)——词法分析器
    Java - 跳表在ConcurrentSkipListMap的运用及其原理
    CentOS上安装JDK的详细教程
    ORACLE的分区(一)
    redis的原理和源码-事务机制
    这三个 Go 水平自测题,你手写不出来还是先老实上班吧,过来看看
  • 原文地址:https://blog.csdn.net/cxwl3sxl/article/details/125518353