Lamento ser largo, pero quiero darle la mayor cantidad de información posible para que pueda ser útil para el análisis.
Sé que hay varias publicaciones con problemas similares, sin embargo, ya he seguido estas publicaciones y otra información disponible en la web, pero el problema persiste.
Tengo un grave problema de rendimiento en SQL Server que está volviendo locos a los usuarios. Este problema se prolonga durante varios años, y hasta finales de 2016 fue administrado por otra entidad y desde 2017 llegó a ser administrado por mí.
A mediados de 2017, pude resolver el problema siguiendo las sugerencias de indexación indicadas por los informes del panel de rendimiento de Microsoft SQL Server 2012. El efecto fue inmediato, sonaba como magia. El procesador que estuvo en los últimos días casi siempre en el 100%, se volvió súper sereno y los comentarios de los usuarios fueron rotundos. Incluso nuestro técnico de ERP estaba encantado, ya que generalmente tomaba 20 minutos obtener ciertos listados y finalmente podía hacerlo en segundos.
Con el tiempo, sin embargo, lentamente comenzó a empeorar. Evité crear más índices, por temor a que demasiados índices empeoraran el rendimiento. Pero en algún momento tuve que borrar los que no tenían uso y crear los nuevos que Performance Dashboard me sugiere. Pero sin impacto.
La lentitud que se siente es esencialmente al guardar y consultar, en el ERP.
Tengo un Windows Server 2012 R2 dedicado a SQL Server 2016 Enterprise (64 bits) con la siguiente configuración:
- CPU: CPU Intel Xeon E5-2650 v3 @ 2.30GHz
- Memoria: 84 GB
- En términos de almacenamiento, el servidor tiene un volumen dedicado al sistema operativo, otro dedicado a los datos y otro dedicado a los registros.
- 17 bases de datos
- Usuarios:
- En el DB más grande están conectados más o menos 113 usuarios concurrentes
- En otro hay unos 9 usuarios.
- En dos de ellos son 3 + 3
- El resto tiene solo 1 usuario cada uno
- Tenemos una web que también escribe para la base de datos más grande, pero donde el uso es mucho menos regular y debe tener unos 20 usuarios.
- Tamaño de DBs:
- La mayor de las bases de datos tiene 290 GB.
- El segundo más grande tiene 100GB.
- El tercero más grande tiene 20 GB.
- El cuarto 14 GB
- El resto son un poco más de 3 GB cada uno
Esta es la instancia de producción, pero también tenemos una instancia de desarrollo que creo que se puede ignorar para este propósito, porque la mayoría de las veces soy el único que se conecta allí, pero este problema ocurre constantemente, incluso cuando no estoy conectado .
El procesador casi siempre es así:
Tenemos rutinas que se ejecutan durante la noche (no problemáticas) y algunas que se ejecutan durante el día.
Los usuarios se conectan a través del Escritorio remoto a otras máquinas configuradas por ODBC 32 para acceder a SQL Server.
El centro de datos donde se encuentran los servidores tiene 100/100 Mbps, así como donde estoy. La mayoría de los sitios están vinculados por MPLS y otros por IPSec (de FO a 4G). El proveedor hizo muchos análisis y el circuito está bien.
La proporción de aciertos de caché es del 99% (tanto solicitudes de usuario como sesiones de usuario)
Las esperas se ven así:
Ya he recopilado datos con Perfmon y tengo los resultados si ayudan con su análisis; personalmente, no obtuve ninguna conclusión del análisis.
Cuento con su apoyo para resolver este problema, estando disponible para proporcionar la información que considere necesaria para la resolución.
Muchas gracias.
Aquí está el descuento de sp_blitz (reemplacé los nombres de las empresas con seudónimos):
Prioridad 1: Fiabilidad :
Última buena DBCC CHECKDB más de 2 semanas de edad
- Maestro
modelo - Último CHECKDB exitoso: 2018-02-07 15: 04: 26.560
msdb - Último CHECKDB exitoso: 2018-02-07 15: 04: 27.740
Prioridad 10: Rendimiento :
CPU con número impar de núcleos
El nodo 0 tiene 5 núcleos asignados. Esta es una muy mala configuración de NUMA.
El nodo 1 tiene 5 núcleos asignados. Esta es una muy mala configuración de NUMA.
Prioridad 20: Configuración de archivo :
- TempDB en la unidad C tempdb: la base de datos tempdb tiene archivos en la unidad C. TempDB con frecuencia crece de manera impredecible, lo que pone a su servidor en riesgo de quedarse sin espacio en el disco C y estrellarse con fuerza. C también suele ser mucho más lento que otras unidades, por lo que el rendimiento puede verse afectado.
Prioridad 50: Fiabilidad :
- Errores registrados recientemente en el seguimiento predeterminado
- master - 2018-03-07 08: 43: 11.72 Error de inicio de sesión: 17892, Severidad: 20, Estado: 1. 2018-03-07 08: 43: 11.72 Error de inicio de sesión para iniciar sesión 'example_user' debido a la ejecución del disparador. [CLIENTE: IPADDR]
(nota: muchos errores como este debido a un activador habilitado que limita las sesiones de usuario, para el control de uso de licencias ERP)
Verificación de página no óptima
DATABASE_A - La base de datos [DATABASE_A] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_B - La base de datos [DATABASE_B] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_C: la base de datos [DATABASE_C] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_D - La base de datos [DATABASE_D] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_E - La base de datos [DATABASE_E] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_F - La base de datos [DATABASE_F] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_G - La base de datos [DATABASE_G] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_H - La base de datos [DATABASE_H] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_I - La base de datos [DATABASE_I] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_Z - La base de datos [DATABASE_Z] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_K - La base de datos [DATABASE_K] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_J - La base de datos [DATABASE_J] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_L: la base de datos [DATABASE_L] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_M - La base de datos [DATABASE_M] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_O - La base de datos [DATABASE_O] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_P - La base de datos [DATABASE_P] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_Q - La base de datos [DATABASE_Q] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_R - La base de datos [DATABASE_R] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_S: la base de datos [DATABASE_S] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_T: la base de datos [DATABASE_T] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_U: la base de datos [DATABASE_U] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_V - La base de datos [DATABASE_V] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DATABASE_X: la base de datos [DATABASE_X] tiene NINGUNO para la verificación de la página. SQL Server puede tener más dificultades para reconocer y recuperarse de la corrupción del almacenamiento. Considere usar CHECKSUM en su lugar.
DAC remoto deshabilitado: el acceso remoto a la conexión de administrador dedicada (DAC) no está habilitado. El DAC puede hacer que la solución remota de problemas sea mucho más fácil cuando SQL Server no responde.
Prioridad 50: Información del servidor :
- Inicialización instantánea de archivos no habilitada: considere habilitar IFI para restauraciones y crecimientos de archivos de datos más rápidos.
Prioridad 100: Rendimiento :
Factor de relleno cambiado
DATABASE_A: la base de datos [DATABASE_A] tiene 417 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_B: la base de datos [DATABASE_B] tiene 318 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_C: la base de datos [DATABASE_C] tiene 346 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_D: la base de datos [DATABASE_D] tiene 663 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_E: la base de datos [DATABASE_E] tiene 335 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_F: la base de datos [DATABASE_F] tiene 1705 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_G: la base de datos [DATABASE_G] tiene 671 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_H: la base de datos [DATABASE_H] tiene 2364 objetos con factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_I: la base de datos [DATABASE_I] tiene 1658 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_Z: la base de datos [DATABASE_Z] tiene 673 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_K: la base de datos [DATABASE_K] tiene 312 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_J: la base de datos [DATABASE_J] tiene 864 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_L: la base de datos [DATABASE_L] tiene 1170 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_M: la base de datos [DATABASE_M] tiene 382 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_O: la base de datos [DATABASE_O] tiene 356 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
msdb: la base de datos [msdb] tiene 8 objetos con factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_P: la base de datos [DATABASE_P] tiene 291 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_Q: la base de datos [DATABASE_Q] tiene 343 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_R: la base de datos [DATABASE_R] tiene 2048 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_S: la base de datos [DATABASE_S] tiene 325 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_T: la base de datos [DATABASE_T] tiene 322 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_U: la base de datos [DATABASE_U] tiene 351 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_V: la base de datos [DATABASE_V] tiene 312 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
DATABASE_X: la base de datos [DATABASE_X] tiene 352 objetos con un factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
tempdb: la base de datos [tempdb] tiene 2 objetos con factor de relleno = 70%. Esto puede causar problemas de rendimiento de memoria y almacenamiento, pero también puede evitar divisiones de página.
Muchos planes para una consulta: 20763 planes están presentes para una sola consulta en la caché del plan, lo que significa que probablemente tengamos problemas de parametrización.
Activadores del servidor habilitados: el activador del servidor [connection_limit_trigger] está habilitado. Asegúrese de comprender lo que está haciendo ese disparador: cuanto menos trabajo haga, mejor.
Procedimiento almacenado CON RECOMPILA
master - [master]. [dbo]. [sp_AllNightLog] tiene WITH RECOMPILE en el código de procedimiento almacenado, lo que puede aumentar el uso de la CPU debido a las constantes recompilaciones del código.
master - [master]. [dbo]. [sp_AllNightLog_Setup] tiene WITH RECOMPILE en el código de procedimiento almacenado, lo que puede causar un mayor uso de la CPU debido a las constantes recompilaciones del código.
Prioridad 110: Rendimiento :
Tablas activas sin índices agrupados
DATABASE_A: la base de datos [DATABASE_A] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_B: la base de datos [DATABASE_B] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_C: la base de datos [DATABASE_C] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_E: la base de datos [DATABASE_E] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_F: la base de datos [DATABASE_F] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_H: la base de datos [DATABASE_H] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_I: la base de datos [DATABASE_I] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_K: la base de datos [DATABASE_K] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_O: la base de datos [DATABASE_O] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_Q: la base de datos [DATABASE_Q] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_S: la base de datos [DATABASE_S] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_T: la base de datos [DATABASE_T] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_U: la base de datos [DATABASE_U] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_V: la base de datos [DATABASE_V] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
DATABASE_X: la base de datos [DATABASE_X] tiene montones, tablas sin un índice agrupado, que se consultan activamente.
Prioridad 150: Rendimiento :
(Nota: aquí hay muchos consejos, pero no pude incluirlos debido a la limitación de caracteres. Si hay otra forma de compartir, indíquelo).