Problemas de performance

El servidor tiene problemas de performance!

Si un cliente te llama y te dice eso, directamente, sin un ‘hola’, es que está en problemas.
Entonces lo único que se puede hacer es recabar un poco de información sobre el servidor, sobre los servicios, sobre si hubo algún cambio, o si algo puede estar pasando que no estaba pasando ‘antes’.

En este caso, un servidor SQLServer que, sin aviso, empezó a desempeñarse de manera horrible, haciendo que el aplicativo que funcionaba usando esos datos sea inusable.

Primero lo primero, chequear los índices y las fechas que se hayan refrescado:

SELECT USER_NAME( OBJECTPROPERTY( i.id, 'OwnerID' ) )
 AS OwnerName,
 OBJECT_NAME( i.id ) AS TableName,
 i.name AS IndexName,
 CASE INDEXPROPERTY( i.id , i.name , 'IsClustered')
 WHEN 1 THEN 'YES'
 ELSE 'NO'
 END AS IsClustered,
 CASE INDEXPROPERTY( i.id , i.name , 'IsUnique'    )
 WHEN 1 THEN 'YES'
 ELSE 'NO'
 END AS IsUnique,
 STATS_DATE( i.id , i.indid ) AS LastUpdatedDate
 FROM sysindexes AS i
 WHERE OBJECTPROPERTY( i.id, 'IsMSShipped' ) = 0 And
 1 NOT IN ( INDEXPROPERTY( i.id , i.name , 'IsStatistics'   ) ,
 INDEXPROPERTY( i.id , i.name , 'IsHypothetical'   ) ) And
 i.indid BETWEEN 1 And 250
 ORDER BY OwnerName, TableName, IndexName;

Pero esto no tiraba nada demasiado extraño… asique se me ocurrió chequear esto mismo, pero con ‘And 1 = INDEXPROPERTY(i.id, i.name, ‘IsDisabled’ )’ antes del ORDER BY…

Un montón de índices deshabilitados. Obviamente, ‘nadie tocó’. Por lo pronto, rehabilitar todos los índices para solucionar el problema:

DECLARE @Table VARCHAR(255)
 DECLARE @cmd NVARCHAR(500)
 DECLARE @fillfactor INT
 SET @fillfactor = 90

SET @cmd = 'DECLARE Cursor4Tables CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
 table_name + '']'' as tableName FROM INFORMATION_SCHEMA.TABLES
 WHERE table_type = ''BASE TABLE'''
-- creando el cursor
 EXEC (@cmd)
 OPEN Cursor4Tables
FETCH NEXT FROM Cursor4Tables INTO @Table
 WHILE @@FETCH_STATUS = 0
 BEGIN
 SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
 EXEC (@cmd)
 FETCH NEXT FROM Cursor4Tables INTO @Table
 END
CLOSE Cursor4Tables
 DEALLOCATE Cursor4Tables

Y listo!

Leave a Reply