2012-12-12 1 views
1

우리 팀은 SQL Server 2005 Express를 통해 데이터 저장소를 관리하는 .NET 웹 응용 프로그램을 개발 중입니다. 배포/설치 후 특정 인덱스를 자동으로 다시 작성하도록 데이터베이스의 작업을 자동화 할 수 있습니까? 그렇다면 어떻게 달성 할 수 있습니까? 데이터베이스에 대해 tasks 이하라고 생각했지만 표시되지 않습니다.SQL Server Express 2005에서 인덱스 재구성

+1

일반적으로 SQL Server에서는 SQL Server 에이전트 작업으로 예약 된 유지 관리 계획을 사용할 수 있습니다. Express는 SQL Agent와 함께 제공되지 않으므로 Windows Scheduler를 사용해야합니다. –

+0

아, 정보 주셔서 감사합니다. Windows Scheduler는 시작/설치시 패키지되고 자동 구성 될 수 있습니까? – Christian

답변

0

데이터베이스를 서비스 할 때이 스크립트는 인덱스의 조각화를 제거하는 데 도움이됩니다. 아마도 다음과 같이 유용 할 것입니다.

SET NOCOUNT ON; 

DECLARE 
     @SQL NVARCHAR(MAX) 
    , @IndexName SYSNAME 
    , @Output VARCHAR(200) 
    , @ServerVersion VARCHAR(100) 

SELECT @ServerVersion = CAST(SERVERPROPERTY('Edition') AS VARCHAR(100)) 

DECLARE cur CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR 
    SELECT 
     'ALTER INDEX [' + ix.name + N'] ON [' + SCHEMA_NAME(t.[schema_id]) + '].[' + t.name + '] ' + 
     CASE 
      WHEN ps.avg_fragmentation_in_percent > 50 THEN 
       CASE WHEN @ServerVersion LIKE 'Enterprise%' OR @ServerVersion LIKE 'Developer%' THEN 
        'REBUILD WITH (SORT_IN_TEMPDB = ON, ONLINE = ON ' + CASE WHEN ix.fill_factor > 0 THEN ', FILLFACTOR = ' + CAST(ix.fill_factor AS VARCHAR(3)) ELSE '' END + ') ' 
       ELSE 
        'REBUILD WITH (SORT_IN_TEMPDB = ON' + CASE WHEN ix.fill_factor > 0 THEN ', FILLFACTOR = ' + CAST(ix.fill_factor AS VARCHAR(3)) ELSE '' END + ') ' 
      END 
      ELSE 'REORGANIZE ' 
     END + 
     CASE 
      WHEN ps.partition_number > 1 THEN N' PARTITION = ' + CAST(ps.partition_number AS NVARCHAR(MAX)) 
      ELSE N'' 
     END + ';', ix.name 
    FROM sys.indexes ix 
    JOIN sys.objects t ON t.[object_id] = ix.[object_id] 
    JOIN (
     SELECT 
       [object_id] 
      , index_id 
      , avg_fragmentation_in_percent 
      , partition_number 
     FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, N'LIMITED') 
     WHERE page_count > 100 
      AND avg_fragmentation_in_percent > 10 
    ) ps ON t.[object_id] = ps.[object_id] AND ix.index_id = ps.index_id 

OPEN cur 

FETCH NEXT FROM cur INTO @SQL, @IndexName 

WHILE @@FETCH_STATUS = 0 BEGIN 

    SELECT @Output = CONVERT(NVARCHAR(15), GETDATE(), 114) + ': ' + @IndexName 
    RAISERROR(@Output, 0, 1) WITH NOWAIT 

    EXEC (@SQL) 

    FETCH NEXT FROM cur INTO @SQL, @IndexName 

END 

CLOSE cur 
DEALLOCATE cur