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补丁造成的,安装一下补丁即可。