none
indices RRS feed

Respostas

  • Realmente, foi um pouco falta de atenção, realmente o Express não tem plano de manutenção, teria de ser via t-sql mesmo e  agendar via Scheduler do Windows, vê se isso te ajuda irmão, esse script ele recria os índices e recompila suas procedures.

    if exists(select 1 from sysobjects s where s.type = 'P' and s.name = 'up_otimiza_bd')
    drop procedure up_otimiza_bd
    go
    
    
    create procedure up_otimiza_bd
    as
    
    
    
    Print '--------------------------------------------------------------'
    Print 'Esta procedure deve ser executada REGULARMENTE.'
    Print 'Isto deixara a performance do banco de dados otimizada!'
    Print '--------------------------------------------------------------'
    
    
    declare @banco varchar(255)
    declare @tabela varchar(255)
    declare @versao int
    select @banco = rtrim(db_name())
    Select @versao = (select version from master..sysdatabases S Where s.name = db_name())
    
    
    
    Print ''
    Print '-----------------------------------------------------------'
    Print 'Desfragmentando/Reindexando as Tabelas do Banco de Dados!'
    Print '-----------------------------------------------------------'
    
    
    set @tabela = ''
    
    If @versao = 539 
      Begin
    	while 1=1
    	begin
    	   select @tabela = Min(name)
    	     from sysobjects
    	    where type = 'U' 
    	      and name > @tabela
    	
    	   if @tabela is null break
    	   Print ''
    	   print 'Reindexando ' + @tabela
    	   DBCC dbreindex(@tabela, '', 80 )
    	   Print @tabela + ' Reindexada com Sucesso!'
    	
    	end
      End
    
    If @versao = 515 
      Begin
    	while 1=1
    	begin
    	   select @tabela = Min(name)
    	     from sysobjects
    	    where type = 'U' 
    	      and name > @tabela
    	
    	   if @tabela is null break
    	   Print ''
    	   print 'Reindexando ' + @tabela
    	   DBCC dbreindex(@tabela, '', 70 )
    	   Print @tabela + ' Reindexada com Sucesso!'
    	
    	end
      End
    
    
    Print ''
    Print '---------------------------------------'
    Print 'Atualizando Estatistica dos Indices!'
    Print '---------------------------------------'
    
    exec sp_updatestats 
    
    Print ''
    Print '-----------------------------------------------'
    Print 'Recompilando as Procedures do Banco de Dados!'
    Print '-----------------------------------------------'
    
    
    declare @Proc varchar(255)
    declare @Exec varchar(255)
    set @Proc = ''
    while 1=1
      begin
        select @Proc=min(name)
          from   sysobjects 
         where  type = 'P' 
           and name > @Proc   
        if @Proc is null break
        Print ''
        Print 'Recompilando a procedure ' + @Proc
        set @exec = 'exec sp_recompile ' + rtrim(ltrim(@Proc))
        execute (@exec)
        Print @Proc + ' Recompilada com Sucesso!'
      end
    
    Print ''
    Print '----------------------------------'
    Print 'Otimizacao do Banco de Dados Concluida!'
    Print '----------------------------------'
    
    ----exec up_otimiza_bd

    Para setar a váriavel @versão você precisa verificar a versão do seu banco na sysdatabase (select version from master..sysdatabases) após criar a procedure efetue o exec up_otimiza_bd


    []'s


    • Editado Fernando Maradei terça-feira, 4 de setembro de 2012 19:14
    • Marcado como Resposta cesarmene terça-feira, 4 de setembro de 2012 19:17
    terça-feira, 4 de setembro de 2012 19:12
  • Boa Noite,

    Não acho que o uso de comandos DBCC DBREINDEX sejam indicados. Eles não permitem por exemplo o uso da reindexação ONLINE e enquanto estiverem rodando irão impor bloqueios nas tabelas utilizadas. Sugiro dar uma olhada no script abaixo (retirado do Books OnLine)

    USE AdventureWorks2008R2;
    GO
    DECLARE tables_cursor CURSOR
       FOR
       SELECT s.name, t.name
       FROM sys.objects AS t
       JOIN sys.schemas AS s ON s.schema_id = t.schema_id
       WHERE t.type = 'U';
    OPEN tables_cursor;
    DECLARE @schemaname sysname;
    DECLARE @tablename sysname;
    FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN;
       EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');
       FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
    END;
    PRINT 'The indexes on all tables have been rebuilt.';
    CLOSE tables_cursor;
    DEALLOCATE tables_cursor;
    GO

    Opcionalmente use os parâmetros de REBUILD ONLINE se desejar

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 5 de setembro de 2012 00:48
    • Marcado como Resposta cesarmene quarta-feira, 5 de setembro de 2012 11:00
    quarta-feira, 5 de setembro de 2012 00:48

Todas as Respostas

  • Boa tarde,

    Tem Plano de manutenção que faz isso, você pode até automatizar e deixar uma hora para fazer esse job automático sem precisar de scripts.


    []'s

    terça-feira, 4 de setembro de 2012 18:57
  • no sql express?
    terça-feira, 4 de setembro de 2012 19:01
  • Realmente, foi um pouco falta de atenção, realmente o Express não tem plano de manutenção, teria de ser via t-sql mesmo e  agendar via Scheduler do Windows, vê se isso te ajuda irmão, esse script ele recria os índices e recompila suas procedures.

    if exists(select 1 from sysobjects s where s.type = 'P' and s.name = 'up_otimiza_bd')
    drop procedure up_otimiza_bd
    go
    
    
    create procedure up_otimiza_bd
    as
    
    
    
    Print '--------------------------------------------------------------'
    Print 'Esta procedure deve ser executada REGULARMENTE.'
    Print 'Isto deixara a performance do banco de dados otimizada!'
    Print '--------------------------------------------------------------'
    
    
    declare @banco varchar(255)
    declare @tabela varchar(255)
    declare @versao int
    select @banco = rtrim(db_name())
    Select @versao = (select version from master..sysdatabases S Where s.name = db_name())
    
    
    
    Print ''
    Print '-----------------------------------------------------------'
    Print 'Desfragmentando/Reindexando as Tabelas do Banco de Dados!'
    Print '-----------------------------------------------------------'
    
    
    set @tabela = ''
    
    If @versao = 539 
      Begin
    	while 1=1
    	begin
    	   select @tabela = Min(name)
    	     from sysobjects
    	    where type = 'U' 
    	      and name > @tabela
    	
    	   if @tabela is null break
    	   Print ''
    	   print 'Reindexando ' + @tabela
    	   DBCC dbreindex(@tabela, '', 80 )
    	   Print @tabela + ' Reindexada com Sucesso!'
    	
    	end
      End
    
    If @versao = 515 
      Begin
    	while 1=1
    	begin
    	   select @tabela = Min(name)
    	     from sysobjects
    	    where type = 'U' 
    	      and name > @tabela
    	
    	   if @tabela is null break
    	   Print ''
    	   print 'Reindexando ' + @tabela
    	   DBCC dbreindex(@tabela, '', 70 )
    	   Print @tabela + ' Reindexada com Sucesso!'
    	
    	end
      End
    
    
    Print ''
    Print '---------------------------------------'
    Print 'Atualizando Estatistica dos Indices!'
    Print '---------------------------------------'
    
    exec sp_updatestats 
    
    Print ''
    Print '-----------------------------------------------'
    Print 'Recompilando as Procedures do Banco de Dados!'
    Print '-----------------------------------------------'
    
    
    declare @Proc varchar(255)
    declare @Exec varchar(255)
    set @Proc = ''
    while 1=1
      begin
        select @Proc=min(name)
          from   sysobjects 
         where  type = 'P' 
           and name > @Proc   
        if @Proc is null break
        Print ''
        Print 'Recompilando a procedure ' + @Proc
        set @exec = 'exec sp_recompile ' + rtrim(ltrim(@Proc))
        execute (@exec)
        Print @Proc + ' Recompilada com Sucesso!'
      end
    
    Print ''
    Print '----------------------------------'
    Print 'Otimizacao do Banco de Dados Concluida!'
    Print '----------------------------------'
    
    ----exec up_otimiza_bd

    Para setar a váriavel @versão você precisa verificar a versão do seu banco na sysdatabase (select version from master..sysdatabases) após criar a procedure efetue o exec up_otimiza_bd


    []'s


    • Editado Fernando Maradei terça-feira, 4 de setembro de 2012 19:14
    • Marcado como Resposta cesarmene terça-feira, 4 de setembro de 2012 19:17
    terça-feira, 4 de setembro de 2012 19:12
  • minha @versao = 661

    porque voce  especializa a versao?

    terça-feira, 4 de setembro de 2012 19:41
  • Boa Noite,

    Não acho que o uso de comandos DBCC DBREINDEX sejam indicados. Eles não permitem por exemplo o uso da reindexação ONLINE e enquanto estiverem rodando irão impor bloqueios nas tabelas utilizadas. Sugiro dar uma olhada no script abaixo (retirado do Books OnLine)

    USE AdventureWorks2008R2;
    GO
    DECLARE tables_cursor CURSOR
       FOR
       SELECT s.name, t.name
       FROM sys.objects AS t
       JOIN sys.schemas AS s ON s.schema_id = t.schema_id
       WHERE t.type = 'U';
    OPEN tables_cursor;
    DECLARE @schemaname sysname;
    DECLARE @tablename sysname;
    FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN;
       EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');
       FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
    END;
    PRINT 'The indexes on all tables have been rebuilt.';
    CLOSE tables_cursor;
    DEALLOCATE tables_cursor;
    GO

    Opcionalmente use os parâmetros de REBUILD ONLINE se desejar

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 5 de setembro de 2012 00:48
    • Marcado como Resposta cesarmene quarta-feira, 5 de setembro de 2012 11:00
    quarta-feira, 5 de setembro de 2012 00:48