2012-01-25 11 views
0

インデックスのオンライン再構築を許可しないタイプのデータベースのインデックスがいくつか存在するため、メンテナンス作業が失敗します。私の業界ではオフラインは選択肢ではないので、特定のインデックスでインデックスを再構築する独自のT-SQLタスクを作成する必要があります。データベースは多数の表と索引があるため、システムにすべての索引とそのデータ型を問い合せる方法はありますか?SQL Server 2005でデータベース内のすべてのインデックスとそのデータ型を取得する方法は?

select o.name as [object_name], 
    ix.name as [index_name], 
    coalesce(c.name,cc.name) as [column_name], 
    t.name as [type_name], 
    coalesce(c.max_length, cc.max_length) as max_length 
from sys.indexes ix 
join sys.objects o 
    on ix.object_id = o.object_id 
left join sys.index_columns ic 
    on ix.object_id = ic.object_id 
    and ix.index_id = ix.index_id 
    and ix.index_id > 1 
left join sys.columns c 
    on ic.object_id = c.object_id 
    and ic.column_id = c.column_id 
left join sys.columns cc 
    on ix.object_id = cc.object_id 
    and ix.index_id in (1,0) 
join sys.types t 
    on t.system_type_id = coalesce(c.system_type_id,cc.system_type_id) 
where o.type = 'U' 
order by object_name, index_name, column_name; 

あなたは、その後のために危険なものを識別することができます

+0

かなり確信してhttp://dba.stackexchange.com/questions/11389/is-staggeringための "HasBlobs" フラグを持っています-reindexing-jobs-a-good-strategy-mssql/11390#comment16991_11390)はこれを考慮に入れています。 –

答えて

0

これは、あなたのヒープのような「ベーステーブル」とクラスタ化インデックスの列と同様に、すべてのINCLUDE列を含むすべてのインデックスのすべての列が表示されますオンライン索引再構築(BLOB/XML/CLRタイプ)。 SQL Server 2012では、LOB列を使用したオンライン索引作成の制限が解除されたことに注意してください。Online Index Operations for indexes containing LOB columnsを参照してください。

+0

これはまさに私が探していたものです。ありがとうございました! – stringpoet

0

最近、このような手順が行われました。それは、この目的([これらのソリューションの両方が、私はここで言及]


ALTER PROCEDURE sp_rebuild_local_idexes 
@RebuildClustered bit = 0 
AS 
BEGIN 
    DECLARE @objectid int 
    DECLARE @indexid int 
    DECLARE @schemaname nvarchar(130) 
    DECLARE @objectname nvarchar(130) 
    DECLARE @indexname nvarchar(130) 
    DECLARE @partitions bigint 
    DECLARE @frag float 
    DECLARE @command nvarchar(4000) 
    DECLARE @HasBlobs bit 
    DECLARE @index_type_desc nvarchar(255) 

    -- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function 
    -- and convert object and index IDs to names. 

    SELECT 
    --object_name(object_id), 
    object_id AS objectid, 
    index_id AS indexid, 
    avg_fragmentation_in_percent AS frag, 
    CASE WHEN (
     SELECT st.object_id 
      from sys.tables st 
      inner join sys.columns sc 
       on st.object_id=sc.object_id 
      inner join sys.types styp 
       on sc.system_type_id=styp.system_type_id and sc.max_length=styp.max_length 
      inner join sys.schemas ss 
       on st.schema_id=ss.schema_id 
      where styp.schema_id=4 
        and styp.name<>'sysname' 
        and styp.name IN ('xml','nvarchar','varchar','image','text','ntext') 
        AND st.object_id = a.object_id 
      group by st.object_id 
    ) IS NULL THEN 0 ELSE 1 END AS HasBlobs, 
    a.index_type_desc 
    INTO #work_to_do 
    FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') AS a 
    WHERE avg_fragmentation_in_percent >= 5.0 AND index_id > 0 
       AND a.index_type_desc IN ('CLUSTERED INDEX','NONCLUSTERED INDEX')   
    ORDER BY a.index_type_desc 

    -- Declare the cursor for the list of partitions to be processed. 
    DECLARE partitions CURSOR FOR SELECT objectid, 
      indexid, 
      frag, 
      HasBlobs, 
      index_type_desc from #work_to_do 
select * from #work_to_do 
    -- Open the cursor. 
    OPEN partitions 

    -- Loop through the partitions. 
    WHILE (1=1) 
    BEGIN 
     FETCH NEXT FROM partitions 
     INTO @objectid, @indexid, @frag,@HasBlobs,@index_type_desc 

     IF @@FETCH_STATUS < 0 BREAK 

     IF @RebuildClustered = 1 AND @index_type_desc != 'CLUSTERED INDEX' 
      CONTINUE; 

     SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name) 
     FROM sys.objects AS o 
     JOIN sys.schemas as s ON s.schema_id = o.schema_id 
     WHERE o.object_id = @objectid 

     SELECT @indexname = QUOTENAME(name) 
     FROM sys.indexes 
     WHERE object_id = @objectid AND index_id = @indexid and type!=3 

     -- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding. 
     IF @frag < 30.0 
      SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE' 

     IF @frag >= 30.0 
     BEGIN 
      print @indexname+ @[email protected] 
      SET @command = N'ALTER INDEX ' + @indexname + 
          N' ON ' + 
          @schemaname + 
          N'.' + @objectname + 
          N' REBUILD' + 
          CASE WHEN @HasBlobs = 0 THEN ' WITH(ONLINE=ON)' ELSE '' END 
      print @command 
     END 

     EXEC (@command) 
     PRINT N'Executed: ' + @command 


    END 

    -- Close and deallocate the cursor. 
    CLOSE partitions 
    DEALLOCATE partitions 
END 

+0

これは役に立ちます、ありがとう。 – stringpoet

関連する問題