SQL2005重新生成索引的的存储过程 sp_rebuild_index 原创
公司运营着的网站,流量很大,网站是交互式的,经常在过了三四个月的时候索引生成的碎片就很多,由于很大一部分页面没有生成静态,这就导致网站在打开的速度上会变慢。
以前都是手工右击索引重新生成,但是索引太多,操作起来费时费力,索引在网上找了个存储过程,自己整理了一下,执行的时候只需要选择相应的数据库,运行execsp_rebuild_index即可,如下。
USE[master] GO SETANSI_NULLSON GO SETQUOTED_IDENTIFIERON GO CREATEproc[dbo].[sp_rebuild_index] ( @Rebuild_Fragmentation_Percentsmallint=5--当逻辑碎片百分比>5%重新生成索引 ) as begin /*调用方法: 1.针对当前实例所有数据库:execsys.sp_MSforeachdb'use?;execsp_rebuild_index' 2.针对当前数据库:execsp_rebuild_index */ --对系统数据库不作重新组织索引和重新生成索引 if(db_name()in('master','model','msdb','tempdb'))return; --如果逻辑碎片(索引中的无序页)的百分比<=5%,就不作重新组织索引和重新生成索引 ifnotexists(select1fromsys.dm_db_index_physical_stats(db_id(),null,null,null,null)awherea.index_id>0anda.avg_fragmentation_in_percent>@Rebuild_Fragmentation_Percent)return printreplicate('-',60)+char(13)+char(10)+replicate('',14)+N'对数据库'+quotename(db_name())+N'进行索引优化'+replicate('',20)+char(13)+char(10) declare@sqlnvarchar(2000),@strnvarchar(2000) declarecur_xcursorfor select'alterindex'+quotename(a.name)+'on'+quotename(object_schema_name(a.object_id))+'.'+quotename(object_name(a.object_id))+'rebuild;'as[sql] ,N'重新生成索引:'+quotename(object_schema_name(a.object_id))+'.'+quotename(object_name(a.object_id))+'.'+quotename(a.name)as[str] fromsys.indexesa innerjoinsys.dm_db_index_physical_stats(db_id(),null,null,null,null)bonb.object_id=a.object_id andb.index_id=a.index_id wherea.index_id>0 andb.avg_fragmentation_in_percent>@Rebuild_Fragmentation_Percent orderbyobject_name(a.object_id),a.index_id opencur_x fetchnextfromcur_xinto@sql,@str while(@@fetch_status=0) begin print@sql exec(@sql) print@str fetchnextfromcur_xinto@sql,@str end closecur_x deallocatecur_x end
你可能在执行过程中会遇到如下错误
消息195,级别15,状态10,过程sp_rebuild_index,第24行
'object_schema_name'不是可以识别的内置函数名称。
不要担心,那是由于没有安装SQLServerSP4补丁造成的,安装一下补丁即可。