martes, 10 de enero de 2017

Calcular espacio que ocupará la actualización de una tabla incremental

El siguiente es un calculo para saber aproximadamente cuanto espacio en disco ocupara la inserción de registros en una tabla de crecimiento incremental:

1. Primero se deben tener los siguientes datos:

  • Registros totales de la tabla
  • Peso total en MB
  • Registros aproximados que se van a insertar (se pueden obtener haciendo un conteo por fecha o mes de inserción para sacar un promedio. Si es una tabla que no tiene fecha, habrá que contar en la fuente cuantos registros serán extraídos)
2. Se hace la siguiente tabla de 3:

  • (RegistrosMes * PesoTotalMB) / RegistrosTotales
Nota: si el calculo es para una tabla de cargue Total, el peso en MB de la tabla es el mismo que ocupará aproximadamente.

Ejemplo varias tablas:

TABLAS REGISTROS TOTALES PESO TOTAL MB REGISTROS MES PESO MES MB
TABLA1                       1.621.128                6.356,73                  540.376            2.118,91
TABLA2                       8.363.896                7.102,56                  491.994                417,80
TABLA3                       2.049.089                2.963,52                  120.535                174,32
TABLA4                             62.047                      59,16                    15.512                  14,79
TABLA5                                   485                         0,16                            54                     0,02
           2.725,84 MB
                    2,66 GB

martes, 20 de diciembre de 2016

Algunas consultas que me han ayudado mucho en el día a día....

--Validar tamaño del log de transacciones--

Select name
,physical_name
,(size/1024) Tamaño_Actual_MB
,max_size Tamaño_Maximo_KB
,growth Crecimiento_Autom
,is_percent_growth
from sys.database_files


--BUSCAR TABLAS EN LA BD--

Select name as object_name
  ,SCHEMA_NAME(schema_id) as schema_name
  ,type_desc
  ,create_date
  ,modify_date
From sys.objects
Where name like 'vol%'
and type_desc = 'USER_TABLE'
Order by modify_date desc;


--Últimos accesos a una tabla (SE DEBEN TENER PERMISOS)--

SELECT tab.name AS Tablename,
       user_seeks, user_scans, user_lookups, user_updates,
       last_user_seek, last_user_scan, last_user_lookup, last_user_update
FROM sys.dm_db_index_usage_stats ius
INNER JOIN sys.tables tab ON (tab.object_id = ius.object_id)
WHERE database_id = DB_ID(N'nombre_bd')
  AND tab.name = 'nombre_tabla'


--BUSCAR COLUMNAS EN TABLAS DE LA BD--

SELECT TABLE_NAME,*
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%migra%' 


--FILEGROUPS--

SELECT *
FROM sys.filegroups

SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID('nombre_bd');


--Tablas por filegroup--

SELECT o.[name] AS 'TABLE',
f.[name] AS 'FILE_GROUP'
FROM sys.indexes i INNER JOIN sys.filegroups f ON i.data_space_id = f.data_space_id
INNER JOIN sys.objects o ON i.[object_id] = o.[object_id]
WHERE o.type = 'U' andi.type < 2
Order by O.name


--CALCULAR FECHA DE NACIMIENTO--

SELECT (((365* year(getdate()))-(365*(year(FECHA_NACIMIENTO))))+ (month(getdate())-month(FECHA_NACIMIENTO))*30 +(day(getdate()) - day(FECHA_NACIMIENTO)))/365


--INFORME TAMAÑO TABLAS BD--

select sysobjects.name
, sum(case when sysindexes.indid<2 then rows else 0 end) as rows
sum(case when sysindexes.indid in (0,1,255) then sysindexes.reserved else 0 end) * 8 as reserved
sum(case when sysindexes.indid in (0,1) then sysindexes.dpages when sysindexes.indid=255 then sysindexes.used else 0 end) * 8 as Data
, (sum(case when sysindexes.indid in (0,1,255) then sysindexes.used else 0 end) - sum(case when sysindexes.indid in (0,1) then sysindexes.dpages when sysindexes.indid=255 then sysindexes.used else 0 end))*8 as index_size
, (sum(case when sysindexes.indid in (0,1,255) then sysindexes.reserved-sysindexes.used else 0 end)*8) as unused
from sysobjects join sysindexes on sysobjects.id=sysindexes.id
where xtype='U' 
group by sysobjects.name
order by 2 desc

--es equivalente a:

sp_spaceused [nombre_tabla]


--GENERACION SCRIPT PARA INFORME TAMAÑO TABLAS BD (se debe ejecutar mostrando los resultados en Text y no en Grid para poderlo copiar para ejecutar)--

SELECT 'sp_columns ' + o.[name] AS 'TABLE', CHAR(13) + CHAR(10) + 'go'
FROM sys.indexes i INNER JOIN sys.filegroups f
ON i.data_space_id = f.data_space_id INNER JOIN sys.objects o
ON i.[object_id] = o.[object_id]
WHERE o.type = 'U' and i.type < 2
Order by O.name


--concatenar registros de un campo en un solo registro--

declare @cadena varchar(1000)
select @cadena = ''

select @cadena = @cadena + ' - ' + Color
from Colores

select Cadena_De_Colores = right(@cadena, len(@cadena) - 3)


--Conocer el porcentaje de fragmentacion de los indices--

WITH INDICES (BD, INDICETIPO, FRAGMENTACION, INDICE, TABLA)
AS (
SELECT DBS.NAME BASEDEDATOS, PS.INDEX_TYPE_DESC, PS.AVG_FRAGMENTATION_IN_PERCENT,
IND.NAME INDICE, TAB.NAME TABLA
FROM
SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULLNULLNULLNULL) PS
INNER JOIN SYS.DATABASES DBS
ON PS.DATABASE_ID = DBS.DATABASE_ID
INNER JOIN SYS.INDEXES IND
ON PS.OBJECT_ID = IND.OBJECT_ID
INNER JOIN SYS.TABLES TAB
ON TAB.OBJECT_ID = IND.OBJECT_ID
WHERE IND.NAME IS NOT NULL AND PS.INDEX_ID = IND.INDEX_ID
AND PS.AVG_FRAGMENTATION_IN_PERCENT > 0)
SELECT DISTINCT 
      CASE
      WHEN FRAGMENTACION > 5 AND FRAGMENTACION <= 30 THEN 'ALTER INDEX ' + INDICE + ' ON ' + TABLA + ' REORGANIZE'    
      WHEN FRAGMENTACION > 30 THEN 'ALTER INDEX ' + INDICE + ' ON ' + TABLA + ' REBUILD'
      END QUERY, FRAGMENTACION, BD, INDICE, TABLA
FROM (SELECT FRAGMENTACION, INDICE, TABLA, BD FROM INDICES
      WHERE FRAGMENTACION > 5) A
ORDER BY FRAGMENTACION DESC