2011-01-20 16 views
8

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!

+0

¿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

+0

@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. :) –

+0

¿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

Respuesta

3

Los cuellos de botella de la base de datos se pueden mejorar con frecuencia mejorando sus consultas SQL. Sin saber cómo se ven, considere crear un almacén de datos operacional o un almacén de datos que llene de manera programada.

A veces acortar las complejas bases de datos relacionales es el camino a seguir. Puede hacer que las consultas se ejecuten de manera significativamente más rápida y que sea mucho más fácil optimizar sus consultas, ya que el modelo es muy plano. Eso también puede hacer que sea más fácil determinar si necesita escalar el servidor de la base de datos hacia arriba o hacia afuera. Un análisis de capacidad y crecimiento puede ayudar a hacer esa llamada.

Las bases de datos transaccionales/altamente normalizadas no suelen ser tan escalables como un ODS o almacén de datos.

Editar: Su ORM puede tener también optimizaciones que puede admitir, que puede valer la pena examinar, en lugar de solo buscar la forma de optimizar las consultas que está enviando a su base de datos. Tal vez pasar por alto su ORM en conjunto para los informes podría ser una forma de tener un control total sobre sus consultas a fin de obtener un mejor rendimiento.

+0

Otro lugar más donde los ORM caen de bruces. –

+0

Sí, un ORM es ideal para ciertos escenarios, quizás no esto. Quizás lo que podría funcionar si la solución debe permanecer orientada a ORM podría ser un modelo de base de datos plana, con una capa de objeto simple para construir las consultas. Sospecho que la ruta de menor resistencia puede ser solo buscar formas de optimizar las consultas de ORM existentes –

2
  1. determinar qué consultas ad-hoc más probable es que se llevará a cabo o limitar los criterios de búsqueda con los procedimientos almacenados .. se puede resumir los datos? .. tratar esta
    aplicación como un almacén de datos.
  2. crear índices en cada columna involucrada en la búsqueda para evitar escaneos de tabla.
  3. crear fragmentos en las expresiones.
  4. actualice periódicamente los datos y actualice las estadísticas a medida que se cargan más clientes potenciales.
  5. pon los archivos temporales creados por las consultas (conjuntos de resultados) en ramdisk.
  6. considere migrar a un motor de RDBMS de alto rendimiento como Informix OnLine.
  7. Inicia otro subproceso para comenzar a mostrar N filas desde el conjunto de resultados mientras se sigue ejecutando la consulta
    .
+2

Lo bueno ... Además, si bien no obtiene este error, los pasos siguen siendo válidos: http://stackoverflow.com/questions/4719841/system-data-sqlclient-sqlexception-timeout-expired#4719892 –

+0

a menos que usted están controlando cuidadosamente sus consultas (y supongo que el ORM no está haciendo esto) los índices excesivos pueden hacer que el DB intente un plan de "selección de todos los oficios" en lugar de seleccionar el "mejor" índice para un tipo de búsqueda dado. – Matthew

+0

Esto es realmente interesante, ¿tienes una herramienta específica que usas para construir ramdisks? Google encontró RamDisk y RamDisk plus. –

2

Considere cómo su ORM está creando las consultas. Si tiene un rendimiento de búsqueda deficiente tal vez podría intentar usar procedimientos almacenados para devolver sus resultados y, si es necesario, múltiples procedimientos almacenados específicamente diseñados para los criterios de búsqueda que están en uso.

Cuestiones relacionadas