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!