4/27/2018 07:48:00 a. m.
Share:
Blog Informático sobre Análisis y Desarrollo de Software.
--
--
create procedure PROC_REINDEXA_TABLAS
as
begin
set nocount on
-- Reduce el tamaño de los archivos de datos y de registro de la base de datos especificada.
DBCC SHRINKDATABASE(N'tempdb')
CREATE TABLE #tablas_reindexar (
ID smallint identity,
Nombre_Tabla varchar(200)
)
insert into #tablas_reindexar values('dbo.cta_corriente')
insert into #tablas_reindexar values('dbo.transaccion')
insert into #tablas_reindexar values('dbo.descuento_cta')
insert into #tablas_reindexar values('dbo.decremento_cta')
insert into #tablas_reindexar values('dbo.DOCUMENTO')
insert into #tablas_reindexar values('dbo.DETALLE_DOCUMENTO')
insert into #tablas_reindexar values('dbo.PAGO')
insert into #tablas_reindexar values('dbo.DETALLE_PAGO')
insert into #tablas_reindexar values('dbo.RESOLUCION')
insert into #tablas_reindexar values('dbo.PERSONA')
insert into #tablas_reindexar values('dbo.INTERES')
CREATE TABLE #reorganizar_reindexar (
Id int identity,
Index_ID int,
NOMBRE_INDICE varchar(200),
NOMBRE_TABLA varchar(200),
PORCENTAJE_FRAGMENTACION decimal(10,2),
ACCION varchar(2)
)
DECLARE @DB_NAME nvarchar(100) = ( select DB_NAME() )
-- LLENAR a la tabla #reorganizar_reindexar los indices de las tablas especificadas,
-- el porcentaje de fragmentación y la acción que corresponde de REORGANIZAR O RECONSTRUIR
DECLARE @nombre_tabla varchar(200) = null
DECLARE @id_tabla smallint = 0
SELECT TOP 1 @id_tabla = ID, @nombre_tabla = nombre_tabla
from #tablas_reindexar
where ID > @id_tabla
order by ID
WHILE @nombre_tabla is not null
BEGIN
insert into #reorganizar_reindexar (Index_ID, NOMBRE_INDICE, NOMBRE_TABLA, PORCENTAJE_FRAGMENTACION, ACCION)
SELECT a.index_id, name as nombre_indice, OBJECT_name(a.object_id) as nombre_tabla,
avg_fragmentation_in_percent as porcentaje_fragmentacion,
case when avg_fragmentation_in_percent <= 30 then 'RO' -- REORGANIZAR
else 'RI' -- REINDEXAR
END as 'ACCION'
FROM sys.dm_db_index_physical_stats (DB_ID(@DB_NAME), OBJECT_ID(@nombre_tabla), NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
where avg_fragmentation_in_percent >= 5
and name <> ''
set @nombre_tabla = null
SELECT TOP 1 @id_tabla = ID, @nombre_tabla = nombre_tabla from #tablas_reindexar
where ID > @id_tabla
order by ID
--Print 'ID = ' + convert(varchar, isnull(@id_tabla,0)) + ', ' + @nombre_tabla
END
DECLARE @i int = 1
declare @nombre_indice varchar(200), @accion varchar(10)
declare @sql nvarchar(200)=''
set @nombre_tabla = null
select top 1 @i = ID, @nombre_tabla = nombre_tabla, @nombre_indice = nombre_indice, @accion = accion
from #reorganizar_reindexar
order by ID
while @nombre_tabla is not null
begin
--RAISERROR(@i, 0, 1) WITH NOWAIT
Print @i
RAISERROR(N'', 0, 1) WITH NOWAIT
if @accion = 'RO'
begin
set @sql = 'ALTER INDEX ' + @nombre_indice + ' ON dbo.' + @nombre_tabla + ' REORGANIZE'
end
else
begin
set @sql = 'ALTER INDEX '+ @nombre_indice + ' ON dbo.' + @nombre_tabla + ' REBUILD' + ' WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON)'
end
--RAISERROR(@sql, 0, 1) WITH NOWAIT
Print @sql
RAISERROR(N'', 0, 1) WITH NOWAIT
execute sp_executesql @sql
set @nombre_tabla = null
select top 1 @i = ID, @nombre_tabla = nombre_tabla, @nombre_indice = nombre_indice, @accion = accion
from #reorganizar_reindexar
where ID > @i
order by ID
end
set nocount off
drop table #reorganizar_reindexar
drop table #tablas_reindexar
end
--
--
use AdventureWorks2012
GO;
-- https://www.lawebdelprogramador.com/foros/SQL/615668-Como-ver-en-que-filegroup-esta-la-tabla.html
select si.name, sf.fileid, sf.name as 'nombre file', sfg.groupid, sfg.groupname
from sysindexes si inner join sysfiles sf on si.groupid = sf.groupid
inner join sysfilegroups sfg on sf.groupid = sfg.groupid
where si.id = object_id('HumanResources.Department')
0 comentarios: