首页 > 数据库 >sqlserver重建索引

sqlserver重建索引

时间:2023-02-08 11:12:04浏览次数:40  
标签:do sqlserver DECLARE 索引 command partitions id SELECT 重建

`DECLARE @objectid INT;
DECLARE @indexid INT;
DECLARE @partitioncount BIGINT;
DECLARE @schemaname sysname;
DECLARE @objectname sysname;
DECLARE @indexname sysname;
DECLARE @partitionnum BIGINT;
DECLARE @partitions BIGINT;
DECLARE @frag FLOAT;
DECLARE @command VARCHAR(8000);
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;
SELECT object_id AS objectid,
index_id AS indexid,
partition_number AS partitionnum,
avg_fragmentation_in_percent AS frag
INTO work_to_do
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0
AND index_id > 0;

SELECT *
FROM dbo.work_to_do;

DECLARE @count INT;
SELECT @count = COUNT(1)
FROM work_to_do;
PRINT '共计需要处理的索引数量为:' + CAST(@count AS VARCHAR);

DECLARE @begin DATETIME;
SET @begin = GETDATE();

DECLARE partitions CURSOR FOR SELECT * FROM work_to_do;
OPEN partitions;
FETCH NEXT FROM partitions
INTO @objectid,
@indexid,
@partitionnum,
@frag;
WHILE @@FETCH_STATUS = 0
BEGIN;
SELECT @objectname = o.name,
@schemaname = 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 = 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;
PRINT '正在处理索引 ' + @objectname + ' -> ' + @indexname + ' 碎片率 ' + CAST(@frag AS VARCHAR) + '%';
IF @frag < 30.0
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REORGANIZE';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT(CHAR, @partitionnum);
PRINT '正在重新组织...';
EXEC (@command);
END;
IF @frag >= 30.0
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REBUILD';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT(CHAR, @partitionnum);
PRINT '正在重新生成...';
EXEC (@command);
END;
FETCH NEXT FROM partitions
INTO @objectid,
@indexid,
@partitionnum,
@frag;
END;
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

PRINT '处理完毕,共计耗时:' + CAST(DATEDIFF(SECOND, @begin, GETDATE()) AS VARCHAR) + '秒';

IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;`

标签:do,sqlserver,DECLARE,索引,command,partitions,id,SELECT,重建
From: https://www.cnblogs.com/fdjj/p/17101029.html

相关文章

  • 数据库索引
    索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。 因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储......
  • 数据库SqlServer迁移PostgreSql实践
    背景公司某内部系统属于商业产品,数据库性能已出现明显问题,服务经常卡死,员工经常反馈数据无法查询或不能及时查询,该系统所使用的数据库为SqlServer,SqlServer数据库属于商业......
  • MYSQL因IN的范围太大导致索引失效问题
    背景最近发现有个用于统计的门店串码激活数量的SQL特别慢,将其摘出来大致如下SELECTa.sku_idasskuId,a.store_idasstoreId,count(*)assaleQtyFROMall_imei_inf......
  • 索引的分类及优化回表查询的方案
    索引可以按照以下几个角度进行分类:从数据结构的角度分类B+tree索引Hash索引Full-texts索引从物理存储的角度分类聚簇索引二级索引【辅助索引】从索引字段......
  • B-Tree(B+Tree)与Hash索引的限制
    index(name,age,sex)B-Tree(B+Tree)限制查询条件不包括最左列,无法使用索引whereage=5andsex=1无法使用索引跳过了索引中的列,则无法完全使用索引w......
  • 开心档-软件开发入门之MongoDB 覆盖索引查询
     作者简介:每天分享​​MongoDB教程​的学习经验、和学习笔记。  座右铭:有自制力,做事有始有终;学习能力强,愿意不断地接触学习新知识。个人主页:​​雪奈椰子的主页​​ 前......
  • 开心档-软件开发入门之MongoDB 覆盖索引查询
    作者简介:每天分享MongoDB教程的学习经验、和学习笔记。  座右铭:有自制力,做事有始有终;学习能力强,愿意不断地接触学习新知识。个人主页:iOS开发上架的主页​​​......
  • 1.6 通过地址和索引实现数组
    CPU把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能。数组是指同样长度的数据在内存中进行连续排列的数......
  • 9个高质量图标的最佳搜索引擎
    对于每个网站开发者来说,设计是很重要的一部分。图标是设计中一个环节。你可以找到许多集合图标的网站。但很难找到免费的高质量图标。这是我在此分享一些免费的高质量图标搜......
  • Containerd 的 Bug 导致容器被重建!如何避免?
    作者简介邓宇星,SUSERancher中国区软件架构师,6年云原生领域经验,参与Rancher1.x到Rancher2.x版本迭代,目前负责RancherForopenEuler(RFO) 项目开发。最近我们关注......