none
Procedure de Manutenção em todos bancos

    Frage

  • Bom dia,

    Preciso criar uma procedure de manutenção dos indices para ser feira em todos os databases, posso criar ela no master e chamar a procedure nos jobs da seguinte forma:

    USE banco

    GO

    EXEC master.dbo.procedure

    GO

    Ou tenho que criar ela em todos os databases???

    Obs. tentei executar ela direto no banco sem o "master.dbo..." seu o seguinte erro:

    Executed as user: XXXXXX\Administrator. Cannot find a table or object with the name "dbo.spt_fallback_db". Check the system catalog. [SQLSTATE 42S02] (Error 2501)

    Montag, 14. Mai 2012 14:10

Antworten

  • Boa tarde Rafael,

         Para seu cenário recomendo a utilização do Plano de execução (Maintenance Plan), pois atraves desta ferramenta você poderá realizar facilmente esse processo de reindexação em todas as bases.

         Caso tenha dificuldade em utilizar essa ferramenta, pode falar que vamos te ajudar.


    Montag, 14. Mai 2012 17:14

Alle Antworten

  • Boa tarde Rafael,

         Para seu cenário recomendo a utilização do Plano de execução (Maintenance Plan), pois atraves desta ferramenta você poderá realizar facilmente esse processo de reindexação em todas as bases.

         Caso tenha dificuldade em utilizar essa ferramenta, pode falar que vamos te ajudar.


    Montag, 14. Mai 2012 17:14
  • Rafael,

    Concordo com a sugestão do Wellington em utilizar o Plano de Manutenção.

    Mas respondendo a sua pergunta isso é possível sim de ser feito. Agora você poderia dizer o que esta procedure deve fazer?

    Vale ressaltar que o usuário que estará sendo executado no job tem que ter permissão de acesso ao banco de dados Master.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    Mittwoch, 16. Mai 2012 16:38
    Moderator
  • Junior,

    Estou querendo criar uma proc para realizar a desfragmentação dos indices.

    Segue

    .

    .

    /*Perform a 'USE <database name>' to select the database in which to run the script.*/ -- Declare variables SET NOCOUNT ON; DECLARE @tablename varchar(255); DECLARE @execstr varchar(400); DECLARE @objectid int; DECLARE @indexid int; DECLARE @frag decimal; DECLARE @maxfrag decimal; -- Decide on the maximum fragmentation to allow for. SELECT @maxfrag = 30.0; -- Declare a cursor. DECLARE tables CURSOR FOR SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'; -- Create the table. CREATE TABLE #fraglist ( ObjectName char(255), ObjectId int, IndexName char(255), IndexId int, Lvl int, CountPages int, CountRows int, MinRecSize int, MaxRecSize int, AvgRecSize int, ForRecCount int, Extents int, ExtentSwitches int, AvgFreeBytes int, AvgPageDensity int, ScanDensity decimal, BestCount int, ActualCount int, LogicalFrag decimal, ExtentFrag decimal); -- Open the cursor. OPEN tables; -- Loop through all the tables in the database. FETCH NEXT FROM tables INTO @tablename; WHILE @@FETCH_STATUS = 0 BEGIN -- Do the showcontig of all indexes of the table INSERT INTO #fraglist EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''') WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS'); FETCH NEXT FROM tables INTO @tablename; END; -- Close and deallocate the cursor. CLOSE tables; DEALLOCATE tables; -- Declare the cursor for the list of indexes to be defragged. DECLARE indexes CURSOR FOR SELECT ObjectName, ObjectId, IndexId, LogicalFrag FROM #fraglist WHERE LogicalFrag >= @maxfrag AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0; -- Open the cursor. OPEN indexes; -- Loop through the indexes. FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag; WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ', ' + RTRIM(@indexid) + ') - fragmentation currently ' + RTRIM(CONVERT(varchar(15),@frag)) + '%'; SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ', ' + RTRIM(@indexid) + ')'; EXEC (@execstr); FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag; END; -- Close and deallocate the cursor. CLOSE indexes; DEALLOCATE indexes; -- Delete the temporary table. DROP TABLE #fraglist; GO

    Abraço,

    Freitag, 25. Mai 2012 20:33
  • Olá Rafael,

    Ações rotineiras são melhores serem executas utilizando Jobs ou Maintenance Plans.

    Por exemplo:

    - BACKUP

    - SHRINK

    - CHECKDB

    - Ações DBCC em geral.

    Qualquer dúvidas estou a disposição.


    Keny Maciel da Silva
    DBA SQL-Server
    MCTS SQL Server 2008 Implementation and Maintenance
    Email: kenymaciel@gmail.com

    Sonntag, 27. Mai 2012 01:29