Desfragmentando os índices de todas as tabelas de determinado database no MSSQL
Abaixo descrevo a rotina que utilizo para desfragmentar os índices das tabelas de determinada base.
Normalmente crio uma procedure com o código abaixo, ou coloco o script diretamente nos blocos de código do agendador do SQLServer Agent no MSSQL 2000 ou MSDE. Se for no SQLExpress 2005, que não possue o Agent, crio um arquivo com extensão .sql e outro arquivo .cmd contendo a chamada para o arquivo .sql e crio uma agendamento no Agendador de tarefas do Windows rodando este arquivo .cmd.
Normalmente crio uma procedure com o código abaixo, ou coloco o script diretamente nos blocos de código do agendador do SQLServer Agent no MSSQL 2000 ou MSDE. Se for no SQLExpress 2005, que não possue o Agent, crio um arquivo com extensão .sql e outro arquivo .cmd contendo a chamada para o arquivo .sql e crio uma agendamento no Agendador de tarefas do Windows rodando este arquivo .cmd.
-- TROCAR NOME DA BASE NA LINHA ABAIXO EM [database_name]
-- E NA LINHA DO COMANDO DBCC INDEXDEFRAG
-- EX1.: De USE [database_name] por USE CIGAM .
-- EX2.: De DBCC INDEXDEFRAG ([database_name], @TableName, @IndexName)
-- por DBCC INDEXDEFRAG ('CIGAM', @TableName, @IndexName)
USE [database_name]
DECLARE @TableName sysname
DECLARE @IndexName varchar(20)
DECLARE cur_fetch
CURSOR FOR
SELECT t.name TableName,
i.name IndexName
FROM sys.sysindexes i,
sys.tables t
WHERE i.id = t.object_id
and i.keycnt > 0
and t.type ='U'
and i.rows > 0
ORDER BY 1,2
OPEN cur_fetch
FETCH NEXT FROM cur_fetch INTO @TableName,@IndexName
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT 'Defragmenting index = '
+ rtrim(@IndexName)
+ ' of the '
+ rtrim(@TableName) + ' table'
--Trocar o [database_name] pelo nome da base, entre apóstrofes. Ex.: 'CIGAM'.
DBCC INDEXDEFRAG ( [database_name], @TableName, @IndexName)
FETCH NEXT FROM cur_fetch INTO @TableName, @IndexName
END
CLOSE cur_fetch
DEALLOCATE cur_fetch
Comentários