Hemos desarrollado un sistema con una pantalla de búsqueda que se parece un poco algo como esto:ASP.NET/SQL 2008 Problema de rendimiento
http://demo1.nsourceservices.com/images/logos/stackoverflow1.png
Como se puede ver, hay una cierta funcionalidad de búsqueda bastante grave . Puede usar cualquier combinación de estados, canales, idiomas, tipos de campañas y, a continuación, restringirlo por su nombre y demás.
Luego, una vez que haya buscado y los cables emergentes aparezcan en la parte inferior, puede ordenar los encabezados.
La consulta utiliza ROWNUM para hacer un esquema de búsqueda, por lo que solo devolvemos algo así como 70 filas a la vez.
El problema
A pesar de que sólo estamos volviendo 70 filas, una gran cantidad de IO y la clasificación que está pasando. Esto tiene sentido, por supuesto.
Esto siempre ha causado algunos picos menores en la cola de discos. Comenzó a ralentizarse más cuando alcanzamos 3 millones de oportunidades, y ahora que nos estamos acercando a 5, las clavijas de Disk Queue permanecen hasta un segundo o dos veces seguidas.
De hecho, todavía sería factible, pero este sistema tiene otra área con un proceso sensible al tiempo, digamos por simplicidad que es un servicio web, que necesita dar respuestas muy rápidamente o causará un tiempo de espera en el Otro final. Los picos de Disk Queue hacen que esa parte se empantane, lo que está provocando tiempos de espera en sentido descendente. El resultado final son las llamadas telefónicas caídas en nuestro IVR automático basado en VoiceXML, y eso es muy malo para nosotros.
Lo que hemos tratado
Hemos probado:
- Las tareas de mantenimiento que reducen el número de clientes potenciales en el sistema al mínimo.
- Agregó los índices obvios para ayudar.
- Ejecutó el asistente de ajuste del índice en el generador de perfiles y aplicó la mayoría de sus sugerencias. Uno de ellos iba a reproducir más o menos toda la tabla dentro de un índice, así que lo pellizqué a mano para hacer un poco menos que eso.
- Agregó más RAM al servidor. Fue un poco bajo, pero ahora siempre tiene algo así como 8 gigas inactivas, y el servidor SQL está configurado para usar no más de 8 gigas, sin embargo, nunca usa más de 2 o 3. Me pareció extraño. ¿Por qué no está poniendo toda la mesa en la RAM? Son solo 5 millones de oportunidades y hay mucho espacio.
- Vaciado de planes de ejecución de consultas. Puedo ver que en este momento los índices parecen estar haciendo su trabajo en su mayoría, aproximadamente el 90% del trabajo está sucediendo durante la etapa de clasificación.
- Se considera dividir la tabla de Leads en una unidad física diferente, pero no tenemos los recursos para eso, y parece que no debería ser necesario.
En el cierre ...
Una parte de mí se siente como el servidor debe ser capaz de manejar esto. Cinco millones de registros no son tantos dado el poder de ese servidor, que es un quad core decente con 16 gigas de ram.Sin embargo, puedo ver cómo la parte de clasificación está causando que se toquen millones de filas solo para devolver un puñado.
¿Qué has hecho en situaciones como esta? Mi instinto es que quizás deberíamos recortar algunas funcionalidades, pero si hay una manera de mantener esto intacto eso me salvará de una guerra con la unidad de negocios.
¡Gracias de antemano!
¿Está buscando GUID? ¿Cuál es su índice agrupado? ¿Has considerado una SSD en el servidor? ¿Estás haciendo búsquedas de comodines? Si es así, es posible que necesite indexar los varchars hacia atrás y hacia adelante – Matthew
@Matthew PK: Sin GUIDs. El índice agrupado es solo la clave principal - LeadID (int). En cuanto a un disco de estado sólido ... Bueno, arrojarle dinero debe ser mi última opción. Pero está en mi mente. :) –
¿Qué hay de devolver todo el conjunto de resultados y la paginación en el cliente? Como usuario, preferiría esperar 2 segundos adicionales por adelantado que esperar cada vez que publico. – Matthew