Mientras está conectado a nuestro servidor de producción (SQL Server 2008, máquina muy potente), esta instrucción SELECT demora 2 segundos , escupiendo todos los campos (4 MB de datos en total).
SELECT TOP (30000) *
FROM person
WITH(NOLOCK);
Desde cualquier otro cuadro en la misma red (conexión mediante autenticación de SQL o autenticación de Windows), la misma consulta demora 1 minuto y 8 segundos .
Estoy probando con esta declaración muy simple para ilustrar que no es un problema de indexación o un problema relacionado con consultas. (Tenemos problemas de rendimiento con todas las consultas en este momento ...)
Las filas vienen en trozos, y no todos a la vez. Obtengo mis primeras filas al instante, y luego espero más de 1 minuto para que lleguen los lotes de filas.
Estas son las estadísticas del cliente de la consulta, cuando se ejecuta desde el cuadro remoto:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 2
Rows returned by SELECT statements 30001
Number of transactions 0
Network Statistics
Number of server roundtrips 3
TDS packets sent from client 3
TDS packets received from server 1216
Bytes sent from client 266
Bytes received from server 4019800
Time Statistics
Client processing time 72441 ms (72 seconds)
Total execution time 72441 ms
Wait time on server replies 0
Podemos ver que el "Tiempo de procesamiento del cliente" es igual al tiempo total de ejecución.
¿Alguien sabe qué pasos puedo tomar para diagnosticar por qué la transferencia de los datos reales está tomando tanto tiempo?
¿Existe un parámetro de configuración de SQL que restrinja o limite la velocidad de transferencia de datos entre máquinas?
fuente
Respuestas:
Su problema definitivamente está relacionado con la red, según su información. Como tal, debe tratarse con profesionales de la red (yo no soy el indicado).
Cosas que pueden ayudar:
¿Está el servidor web en la misma subred que el servidor SQL?
¿Hay enrutadores / puentes, etc., entre ellos?
No hay muchos cambios posibles en el servidor SQL:
Está utilizando un tamaño predeterminado: consulte sus estadísticas: "Paquetes TDS recibidos del servidor 1216" (4MB / 1K = 4KB). Sí, el tamaño del búfer TDS se puede cambiar: consulte en google: "Tamaño del lote del protocolo TDS"
Buena discusión sobre el tema: "¿el tamaño del paquete de red de sql realmente determina el tráfico de ida y vuelta?"
Sin embargo, cambiar el tamaño del paquete TDS tendrá (inevitablemente) efectos impredecibles y solo debe usarse en la producción en casos excepcionales.
El cambio de arquitectura o la introducción del almacenamiento en caché de datos en el nivel medio también ayudaría.
fuente
Este problema esta resuelto ahora.
Era un problema de red, y la caja SQL estaba usando una tarjeta NIC de 100 MB / s , en lugar de una tarjeta NIC de 10 GB / s ...
Un cambio en la configuración de la red para usar la tarjeta de red correcta ha solucionado el problema. Ahora estamos obteniendo un rendimiento similar para todas las consultas del cuadro SQL de producción y de otros cuadros en la red.
Gracias a todos por su ayuda.
fuente
En la lectura inicial, parece que está experimentando algunos problemas de latencia de red. ¿Has mirado algunos de los contadores de Network Perfmon? Esos pueden darle alguna indicación de lo que está sucediendo con la red.
Cita de ¿Qué mostradores de Perfmon debo monitorear y qué significa cada uno de ellos?
fuente
Algunas preguntas preliminares: 1) El servidor tiene un cliente SQL en Prod. configuración de la máquina del servidor, ¿verdad? Entonces, si realiza la misma consulta desde el cliente ubicado en la misma máquina, ¿se completará en 2 segundos? ¿Intentaste hacer esto? ¿Son realmente 2 segundos? 2) Usted mencionó que la configuración de su entorno de producción ha cambiado (o el servidor de producción se ha movido a otra red / reconstrucción total del servidor realizada), ¿verdad? ¿Cuál fue el tiempo de consumo de consultas en el antiguo entorno de producción?
Por curiosidad: ¿este es un ejemplo de la consulta? o la redacción exacta de la consulta? La consulta realmente NO contiene la cláusula WHERE? De acuerdo conmigo en que esto es muy inusual. ¿La tabla tiene un índice agrupado o es un montón? La tabla contiene cuántas filas en total? ¿La mesa está muy fragmentada? Por curiosidad: ¿por qué SELECCIONAR TOP NNN? ¿Por qué no SET ROWCOUNT NNN - luego SELECT *? Esta consulta es emitida cuántas veces por el cliente por día? 1? 100? 1MLN? ¿Los datos subyacentes son estáticos o dinámicos y cambian mucho? ¿Cuánto (0.01 por ciento por día? 1 por ciento por día? 10 por ciento por día?) La salida de la consulta se procesa mediante programación? (¿no lo hace un usuario?) ¿Por qué no se almacena en caché / no se almacena en el nivel medio? gracias Alexei
fuente