1. ホーム
  2. データベース
  3. mssql2005

[オリジナル】SQL2005再ビルドインデックスストアドプロシージャ sp_rebuild_index

2022-01-23 19:08:28

アクセス数の多いサイトを運営しており、インタラクティブなサイトであるため、3~4ヶ月後にインデックスが大量にフラグメントを生成することがしばしばあり、ページの大部分が静的に生成されていないため、サイトのオープン速度が低下する原因となっています。

以前は、インデックスを右クリックして手動で再 生成していましたが、インデックスが多すぎて、操作に時間と手間がかかっていました。インデックスはオンラインでストアドプロシージャを見つけ、実行は以下のように適切なデータベースを選択してexec sp_rebuild_indexを実行すればよいように整理した。

USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE proc [dbo]. [sp_rebuild_index] 
(
  @Rebuild_Fragmentation_Percent smallint = 5 -- when logical fragmentation percentage > 5% rebuild index
)
as
begin
  /* Call method.
  1. for the current instance of all databases: exec sys.sp_MSforeachdb 'use ? ;exec sp_rebuild_index'
  2. For the current database: exec sp_rebuild_index
  */
  
  --no re-organization of indexes and re-build indexes for the system database
  if (db_name() in ('master','model','msdb','tempdb')) return;  
  
  -- If the percentage of logical fragments (unordered pages in the index) <= 5%, do not reorganize the index and regenerate it
  if not exists(select 1 from sys.dm_db_index_physical_stats(db_id(),null,null,null,null,null) a where a.index_id>0 and a.avg_fragmentation_in_ percent > @Rebuild_Fragmentation_Percent) return
  
  
  print replicate('-',60)+char(13)+char(10)+replicate(' ',14)+N'perform index optimization on database ' +quotename(db_name())+N' +replicate(' ',20)+char(13)+char(10 )  
    
  declare @sql nvarchar(2000),@str nvarchar(2000)
  
  declare cur_x cursor for 
    select 'alter index '+quotename(a.name)+' on '+quotename(object_schema_name(a.object_id))+'.' +quotename(object_name(a.object_id))+' rebuild;' as [sql]
        ,N'regenerate index:' +quotename(object_schema_name(a.object_id))+'.' +quotename(object_name(a.object_id))+'.' +quotename(a.name) as [str]
      from sys.indexes a
        inner join sys.dm_db_index_physical_stats(db_id(),null,null,null,null,null) b on b.object_id=a.object_id
          and b.index_id=a.index_id  
      where a.index_id>0  
        and b.avg_fragmentation_in_percent > @Rebuild_Fragmentation_Percent
      order by object_name(a.object_id),a.index_id
      
  open cur_x
  fetch next from cur_x into @sql,@str  
  
  while (@@fetch_status = 0)
  begin
 print @sql
    exec(@sql)
 
    print @str
    fetch next from cur_x into @sql,@str  
      
  end
  close cur_x
  deallocate cur_x 
    
end



実行中に次のようなエラーが発生することがあります。

メッセージ 195, レベル 15, ステータス 10, プロシージャ sp_rebuild_index, 行 24
'object_schema_name' は認識可能な組み込み関数名ではありません。

がないためですので、ご安心ください。 SQL Server SP4 パッチ パッチをインストールするだけです。