Últimos artículos
Estas son las últimas entradas en el blog.
De todo un poco para solucionar los problemas diarios de un administrador de IT y DBA
Estas son las últimas entradas en el blog.
De todo un poco para solucionar los problemas diarios de un administrador de IT y DBA
En este oficio se escucha de manera repetitiva frases como: «Mi servidor anda lento«, «Se tarda demasiado«, «como hago para que funcione más rápido«.
Al intentar encontrar la causa del problema muchas veces no sabes dónde empezar. En esta serie de artículos veremos algunos pasos a seguir para tratar de determinar el motivo que lo origina.
A tener en cuenta:
Generalmente el resultado es ocasionado, no solo por un motivo, sino por la suma de varios. Por lo se debe analizar y tomar resultados de la mayor cantidad de variables posibles (red, disco, memoria, consultas, etc) y recién ahí, en conjunto tomar medidas. Caso contrario, si se analizan por separado, seguramente cada uno determinará una solución diferente.
Estádisticas de Espera (waits statistics)
Nos darán una visión general de cuáles son los mayores tiempos de espera a nivel de recursos y de sistema operativo.
En esta oportunidad nos valemos de un script de http://habrahabr.ru/post/216309/ para listar los mismos:
SELECT TOP 10 wait_type , max_wait_time_ms wait_time_ms , signal_wait_time_ms , wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms , 100.0 * wait_time_ms / SUM(wait_time_ms) OVER ( ) AS percent_total_waits , 100.0 * signal_wait_time_ms / SUM(signal_wait_time_ms) OVER ( ) AS percent_total_signal_waits , 100.0 * ( wait_time_ms - signal_wait_time_ms ) / SUM(wait_time_ms) OVER ( ) AS percent_total_resource_waits FROM sys.dm_os_wait_stats WHERE wait_time_ms > 0 -- remove zero wait_time AND wait_type NOT IN -- filter out additional irrelevant waits ( 'SLEEP_TASK', 'BROKER_TASK_STOP', 'BROKER_TO_FLUSH', 'SQLTRACE_BUFFER_FLUSH','CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'LAZYWRITER_SLEEP', 'SLEEP_SYSTEMTASK', 'SLEEP_BPOOL_FLUSH', 'BROKER_EVENTHANDLER', 'XE_DISPATCHER_WAIT', 'FT_IFTSHC_MUTEX', 'CHECKPOINT_QUEUE', 'FT_IFTS_SCHEDULER_IDLE_WAIT', 'BROKER_TRANSMITTER', 'FT_IFTSHC_MUTEX', 'KSOURCE_WAKEUP', 'LAZYWRITER_SLEEP', 'LOGMGR_QUEUE', 'ONDEMAND_TASK_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BAD_PAGE_PROCESS', 'DBMIRROR_EVENTS_QUEUE', 'BROKER_RECEIVE_WAITFOR', 'PREEMPTIVE_OS_GETPROCADDRESS', 'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'WAITFOR', 'DISPATCHER_QUEUE_SEMAPHORE', 'XE_DISPATCHER_JOIN', 'RESOURCE_QUEUE' ) ORDER BY wait_time_ms DESC
El resultado dependerá de su servidor:
A continuación una descripción de los waits mas comunes:
Una vez hecho algún cambio deberé reiniciar los contadodes, y empezar a recopilar las estadísticas de nuevo, para verificar si hubo alguna mejora:
DBCC SQLPERF('sys.dm_os_wait_stats',clear)
Esta primer entrada es el primer paso para determinar obtener una visión generar. En próximas entradas veremos algunas tareas específicas para continuar con la mejora del rendimiento del motor SQL Server.
Últimamente por seguridad he estado migrando el puerto default del MS SQL Server de 1433 a otro diferente. Y en consecuencia más de uno me pregunto como usar el IDE de Microsoft para conectarse luego de este cambio. Si quieres saber como cambiar el puerto en el que corre tu motor SQL mirá este post (https://maurobernal.com.ar/blog/mssql/cambiar-el-puerto-del-ms-sql-server)
Aquí te cuento como cambiar el puerto de la conexión.
Si tienen configurado el motor SQL Server en un puerto diferente al predeterminado (1433), para poder realizar una conexión desde el SQL Server Management Studio se debe ingresar de la siguiente manera:
[HOST] , [PUERTO]
Es decir que separamos el mismo con una coma (,).
Ejemplo:

Si llegaste hasta aquí pero no sabes como se puede volver a cambiar el mismo, mirá este post: (https://maurobernal.com.ar/blog/mssql/cambiar-el-puerto-del-ms-sql-server)
De la siguiente manera podrán averiguar la intercalación (collation) de una base de datos en MS SQL Server:
TSQL:
SELECT
DATABASEPROPERTYEX(‘MASTER’, ‘Collation’)
as Intercalacion;
SQL Server Management Studio:

Cuando trabajamos con campos calculados a veces es necesario incluir el nombre de la base sobre la que está realizando la consulta. De esta manera si realizamos esta misma consulta en varias veces, y unimos el resultado tendremos siempre un dato agrupador que nos identificará la base origen.
Esta función es DB_NAME().
Ejemplo:
select db_name() as BaseActual
Resultado:
| BaseActual |
| master |
El siguiente script en TSQL lista todas las bases de datos con sus respectivos tamaños en Megas y Gigas.
SELECT DB_NAME(db.database_id) DatabaseName, round((CAST(mfrows.RowSize AS FLOAT)*8)/1024,2) RowSizeMB, round((CAST(mflog.LogSize AS FLOAT)*8)/1024,2) LogSizeMB, round((CAST(mfrows.RowSize AS FLOAT)*8)/1024+(CAST(mflog.LogSize AS FLOAT)*8)/1024,2) DBSizeMB, round((CAST(mfrows.RowSize AS FLOAT)*8)/1024/1024+(CAST(mflog.LogSize AS FLOAT)*8)/1024/1024,2) DBSizeGB FROM sys.databases db LEFT JOIN (SELECT database_id, SUM(size) RowSize FROM sys.master_files WHERE type = 0 GROUP BY database_id, type) mfrows ON mfrows.database_id = db.database_id LEFT JOIN (SELECT database_id, SUM(size) LogSize FROM sys.master_files WHERE type = 1 GROUP BY database_id, type) mflog ON mflog.database_id = db.database_id LEFT JOIN (SELECT database_id,SUM(size) StreamSize FROM sys.master_files WHERE type = 2 GROUP BY database_id, type) mfstream ON mfstream.database_id = db.database_id LEFT JOIN (SELECT database_id, SUM(size) TextIndexSize FROM sys.master_files WHERE type = 4 GROUP BY database_id, type) mftext ON mftext.database_id = db.database_id ORDER BY 4 DESC
Complementa al siguiente script para listar las bases de datos con su ubicación:
https://maurobernal.com.ar/blog/t-sql/listar-todas-las-bases-de-datos-con-su-respectiva-ubicacion-y-tamanos/
Verificar que se hayan realizado correctamente los backups es tarea fundamental de un DBA.
Para ello contamos con una serie de tablas provistar por Microsoft SQL Server para almacenar dicha información:
Los siguientes scripts pueden facilitar dicha tarea.
Más adelante trabajaremos con más detalle.
Atención: Si copian y pegan puede que la comilla simple (‘) se convierta a comilla doble («»).
/*******************************************************************************
Último Backup de la Base
******************************************************************************/
SELECT S.Name AS DB, MAX(B.backup_finish_date) Fecha,DATEDIFF(hh,MAX(B.backup_finish_date),GETDATE()) Antiguedad_HS ,
CASE
WHEN DATEDIFF(hh , MAX(B.backup_finish_date) , GETDATE()) > 24 THEN ‘SI’
WHEN MAX(B.backup_finish_date) IS NULL THEN ‘SI’ ELSE »
END AS SinBackupUltimas24hs
FROM sys.sysdatabases S LEFT OUTER JOIN msdb.dbo.backupset B ON B.database_name = S.name
WHERE B.type NOT LIKE ‘L’ AND S.name NOT LIKE ‘tempdb’
GROUP BY S.Name ORDER BY S.Name
/*******************************************************************************
Ultimo Backup del Log
******************************************************************************/
SELECT S.Name AS DB,MAX(B.backup_finish_date) Fecha ,
CASE WHEN DATEDIFF(hh , MAX(B.backup_finish_date) , GETDATE()) > 4 THEN ‘SI’
WHEN MAX(B.backup_finish_date) IS NULL THEN ‘SI’ ELSE »
END AS SinBackupUltimas24hs
FROM sys.sysdatabases S LEFT OUTER JOIN msdb.dbo.backupset B ON B.database_name = S.name
WHERE B.type LIKE ‘L’ AND S.name NOT LIKE ‘tempdb’
GROUP BY S.Name ORDER BY S.Name
/*******************************************************************************
Detalle por Backups de los últimos 7 días
******************************************************************************/
SELECT database_name as DB, name AS Backup_Name, backup_finish_date AS LastBackup,
CASE [type] WHEN ‘D’ THEN ‘Full’
WHEN ‘L’ THEN ‘Log’
WHEN ‘I’ THEN ‘Differential’ ELSE ‘Other’
END AS Tipo_Backup
FROM msdb.dbo.backupset B
WHERE backup_finish_date > DATEADD(dd,-7,GETDATE())
ORDER BY database_name, backup_finish_date desc
IT CallCenters
Desarrollo de aplicaciones web y mobile
