SQL索引碎片整理脚本

原文发布时间为:2011-02-23 —— 来源于本人的百度文章 [由搬家工具导入]

reindex是比较好的选择,速度快,但是他不能在线操作
INDEXDEFRAG 比较慢,但是可以在线操作
rebuild建议在碎片较少时采用。

附上微软的重建索引脚本,从里面也可以看出微软根据碎片大小推荐的方式,不过这个要随每个不同的数据库而定。
5d7fe10f3b2ea8796159f33b.jpg-- ensure a USE <databasename> statement has been executed first.
9eca672a848e5a7ed52af13b.jpgSET NOCOUNT ON;
276a952d32fd5767359bf73b.jpgDECLARE @objectid int;
4bc781adcc37095a4a36d63b.jpgDECLARE @indexid int;
93199834dc4c7c685ab5f53b.jpgDECLARE @partitioncount bigint;
73a8b33bb162b6b914cecb3b.jpgDECLARE @schemaname sysname;
1c8679eaf9194980d439c93b.jpgDECLARE @objectname sysname;
52fd86d33beec9533bf3cf3b.jpgDECLARE @indexname sysname;
920a0600ca2445d4e850cd3b.jpgDECLARE @partitionnum bigint;
7dc08a871b874a79c75cc33b.jpgDECLARE @partitions bigint;
ae63852a328b6f6b5243c13b.jpgDECLARE @frag float;
816fa038a59484a1b311c73b.jpgDECLARE @command varchar(8000);
14704bf24ac6ec40b17ec53b.jpg-- ensure the temporary table does not exist
f52223134aa9b5d36438db3b.jpgIF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
f74d7a8099ef73849023d93b.jpg    DROP TABLE work_to_do;
220bbcd76ff4e88ea044df3b.jpg-- conditionally select from the function, converting object and index IDs to names.
d61027dda19cd2675882dd3b.jpgSELECT
e6771d345b5acde4d1a2d33b.jpg    object_id AS objectid,
1eb102b7d47a73a730add13b.jpg    index_id AS indexid,
9791bcf43775b4bc7709d73b.jpg    partition_number AS partitionnum,
769e7bef7ed13465adafd53b.jpg    avg_fragmentation_in_percent AS frag
313afb36a677518ea2cc2b3b.jpgINTO work_to_do
eb9c9eddaf14038a8c10293b.jpgFROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
e4ffccd983c87eba38012f3b.jpgWHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
ca23b1e929d95e6cb90e2d3b.jpg-- Declare the cursor for the list of partitions to be processed.
7e32913faad604bf55e7233b.jpgDECLARE partitions CURSOR FOR SELECT * FROM work_to_do;
ff3dcbec403f49822e2e213b.jpg
dc63ffc2cfbafa66e4dd3b3b.jpg-- Open the cursor.
92513535f905984291ef393b.jpgOPEN partitions;
a2ee57118e370995a6ef3f3b.jpg
d7dcc6c68737b1489c163d3b.jpg-- Loop through the partitions.
e0dc7e1bbfce82a9ae51333b.jpgFETCH NEXT
da254dfa8b898c8db58f313b.jpg   FROM partitions
e86243de9257f30795ee373b.jpg   INTO @objectid, @indexid, @partitionnum, @frag;
f3bc3c54bc368f4c3b29353b.jpg
d3dd401f10f152a6e1fe0b3b.jpgWHILE @@FETCH_STATUS = 0
7d1a9df5cc26e676bd31093b.jpg    BEGIN;
a7cd292592e9233335a80f3b.jpg        SELECT @objectname = o.name, @schemaname = s.name
fb02ec600470218c8cb10d3b.jpg        FROM sys.objects AS o
739beedfbf69b4404854033b.jpg        JOIN sys.schemas as s ON s.schema_id = o.schema_id
ca827b137d8c7670dc54013b.jpg        WHERE o.object_id = @objectid;
0e67b923eb8c291d9358073b.jpg
9a67e64eaa80ae5ab2de053b.jpg        SELECT @indexname = name 
d56b61098906e3d1d0581b3b.jpg        FROM sys.indexes
f4ed2c82ed80b3ec6d81193b.jpg        WHERE  object_id = @objectid AND index_id = @indexid;
966b7cbf5259ff5918d81f3b.jpg
2bb2300a5900c36db0351d3b.jpg        SELECT @partitioncount = count (*) 
5eeb0c3ef3ed4ca9838b133b.jpg        FROM sys.partitions
f60683fac653d94da9d3113b.jpg        WHERE object_id = @objectid AND index_id = @indexid;
c5b8161eee0b824c4034173b.jpg
efe04d1f09ece859314e153b.jpg-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding
777d951fd912ae9ba686693b.jpgIF @frag>5 AND @frag <= 30.0
d2f961c8e95eb6447e3e6f3b.jpg    BEGIN;
e0b579172fe6185ac83d6d3b.jpg    SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REORGANIZE';
380dd7099be50f9c3ac7633b.jpg    IF @partitioncount > 1
8e0ec0cf6f1fe06ef9dc613b.jpg        SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
69ee13cc7101f24300e9283b.jpg    EXEC (@command);
7cf42f3dae04ae53bba1673b.jpg    END;
fd927d1128533843b8127b3b.jpg
35b8f710e5cab7afc2ce793b.jpgIF @frag > 30.0
fe2178fc9d16bcaefd037f3b.jpg    BEGIN;
84fd73fd9cdbed16d7887d3b.jpg    SELECT @command = 'ALTER INDEX ' + @indexname +' ON ' + @schemaname + '.' + @objectname + ' REBUILD';
bb302245b450ab6c8694733b.jpg    IF @partitioncount > 1
91bb643fe34cdb917c1e713b.jpg        SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
c0a714c21bc6ad480ff4773b.jpg    EXEC (@command);
3a2d621b662c6486ac6e753b.jpg    END;
49c7abd5c7b6a29750da4b3b.jpgPRINT 'Executed ' + @command;
ea5d6dc43d02fe9838db493b.jpg
16e931cb5703c9ae53664f3b.jpgFETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;
7ee806fd22beaf4508244d3b.jpgEND;
155560167bfcd44b962b433b.jpg-- Close and deallocate the cursor.
660c080e68342bb437d1223b.jpgCLOSE partitions;
4e171b18e3f3ab5434fa413b.jpgDEALLOCATE partitions;
d01864074322999e7a89473b.jpg
3cdfe4e72309507db838203b.jpg-- drop the temporary table
72c956cd0351e1020eb3453b.jpgIF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
3cba2e51756b707743a75b3b.jpg    DROP TABLE work_to_do;
4880bf243e7fa660c995593b.jpgGO


如果提示     '(' 附近有语法错误,则将上面的 DB_ID() 这个改成当前库的ID (当前库的ID,你可以用查询分析器 SELECTDB_ID() 查询出来)


BOL的推荐:



> 5% 且 < = 30%

ALTER INDEX REORGANIZE

> 30%

ALTER INDEX REBUILD WITH (ONLINE = ON)*

转载于:https://www.cnblogs.com/handboy/p/7163997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值