2010-10-26 7 views
5

Heredé la aplicación y lo que hace es obtener datos de 4 vistas con un (archivo xml) en fragmentos de 1000 registros y luego los escribe en un archivo xml todo esto dividido por un parámetro de tipo que tiene 9 posibilidades diferentes. Eso significa que en el peor de los casos habrá 36 conexiones a la base de datos para cada 1000 de esa combinación de tipo/vista.¿Qué ventajas tiene una gran consulta de base de datos sobre muchas pequeñas

Los datos reales existirán de 90,000 líneas y en este caso 900 - 936 veces obteniendo hasta 1000 líneas de la base de datos.

Ahora me pregunto qué ventajas daría leer todos los datos en la aplicación y hacer que la aplicación trabaje con esto para escribir los más de 900 archivos.

1000 líneas es aproximadamente 800MB, 90,000 líneas es aproximadamente 81GB de datos que se transfieren.

El código tendría que ser reescrito si lo leímos de una vez y aunque tendría más sentido, este es un trabajo de una sola vez. Después de las 90,000 líneas, nunca usaremos este código nuevamente. ¿Vale la pena gastar 2, 3 horas para volver a escribir el código que funciona para reducir la cantidad de conexiones de esta manera?

+7

No parece que valga la pena reescribir, si se trata de un trabajo de una sola vez. En realidad, podría terminar de ejecutarse cuando termine de escribir esta oración. –

+1

¿Vale la pena volver a escribir el código de un solo uso probado y en funcionamiento? Si no hay problemas reales, diría que probablemente pueda encontrar un mejor uso para su tiempo ... – Kendrick

+0

¿Las solicitudes múltiples tienen lugar dentro de una sola transacción? ¿Los datos pasan por un servicio web o directamente a la caja? Yo diría que estos son importantes para responder la pregunta. – PaulG

Respuesta

6

Si se trata de algo de una sola vez, entonces, ¿por qué gastar un esfuerzo para optimizarlo? Respuesta: no.

Permítanme agregar, sin embargo, en respuesta a su general pregunta de qué ventaja tiene una gran consulta sobre muchas pequeñas: probablemente ninguna. Si ejecuta una gran consulta, está dejando mucha magia al middleware, puede que funcione o no.

Si bien tener 36 conexiones simultáneas tampoco es óptimo, es probablemente mejor que ejecutar una consulta que podría devolver 80 gigabytes de datos. La solución ideal (si tuviera que usar este código más de una vez) sería reescribirla para obtener datos en fragmentos pero sin dejar muchas conexiones abiertas simultáneamente.

+0

en realidad sería de solo 1 conexión por vez, pero en el caso en vivo, 936 veces se repite en un bucle. si recibo tu respuesta correctamente, la solución ideal es la que tengo ahora. – Andy

+0

Sí, eso creo! Obtener datos en fragmentos es la mejor práctica para manejar grandes bloques de datos. De lo contrario, depende de cualquier cantidad de otros sistemas intermedios (el servidor SQL, .NET, LINQ, un proveedor de datos, etc.) para administrar el flujo de lo que se envía y recibe entre usted y el servidor. En el peor de los casos, la aplicación puede intentar cargar todo el resultado de forma síncrona. Asp.net probablemente manejaría esto de alguna manera, no estoy exactamente seguro de cuál sería el manejo predeterminado, pero es mucho mejor que su aplicación decida cuántos datos es razonable solicitar a la vez. –

+0

Una observación más: 800 megabytes es todavía una gran cantidad de datos para cargar en la memoria a la vez. La asignación/desasignación de memoria podría ser lenta, probablemente sería mejor reducir el tamaño del fragmento. Si todo lo que hace la aplicación es leer una fila y analizarla en un archivo XML, y no necesita más información que la de cada fila para hacer su trabajo, incluso el hecho de obtener una sola fila a la vez parece razonable dada la gran cantidad de datos en cada fila. –

4

¿El código ya funciona? Si lo hace, no me tomaría tiempo reescribirlo. Usted corre hacia el riesgo de introducir errores en el código. Ya que usarás esto una vez y nunca volverás a usarlo, no parece que valga la pena el esfuerzo.

4

Si hablamos de SQL Server, la mayor desventaja de una consulta grande (un solo lote) sobre muchas pequeñas (tenga en cuenta el sentido opuesto a la pregunta que está haciendo) es que solo puede haber un plan de consulta por lote.

1

Si es un trabajo de una sola vez, diría que no. Muchas veces he hecho cosas que normalmente no haría (cursores) pero SOLO porque era un trabajo de una sola vez.

Pregúntese si tiene sentido gastar de 2 a 3 horas en algo que ya funciona y que nunca volverá a utilizar. Obviamente, hay otros factores a tener en cuenta. Al igual que esto bloqueará su base de datos de producción durante 2-3 horas?

Si no hay efectos secundarios desastrosos, yo diría que use lo que tiene.

Cuestiones relacionadas