2009-03-22 15 views
8

me gusta herramientas ORM, pero a menudo he pensado que para los grandes cambios (miles de filas), parece ineficaz para cargar, actualizar y guardar cuando algo comoactualizaciones gran base de datos de volumen con un ORM

UPDATE [table] set [column] = [value] WHERE [predicate] 

haría dar un rendimiento mucho mejor.

Sin embargo, suponiendo que uno deseara seguir esta ruta por motivos de rendimiento, ¿cómo se aseguraría de que los objetos almacenados en memoria caché se actualizaran correctamente?

Supongamos que está utilizando LINQ to SQL, y que ha estado trabajando en un DataContext, ¿cómo se asegura de que su ACTUALIZACIÓN de alto rendimiento se refleje en el gráfico de objetos de DataContext?

Esto podría ser un "no" o "utilizar activadores en la base de datos para llamar al código .NET que elimina la memoria caché", etc. etc., pero estoy interesado en encontrar soluciones comunes para este tipo de problema.

+0

¿No es esta una de las razones para usar un ORM? es decir, ¿proporciona mecanismos para sincronizar objetos en memoria y objetos almacenados actualizados? El mecanismo será, por supuesto, ORM específico –

+0

Sí, pero mi punto es que si utiliza una herramienta ORM y desea mejorar el rendimiento de las actualizaciones masivas mediante un método SQL directo, perderá algunos de los beneficios de ORM. –

Respuesta

4

Tiene razón, en este caso, utilizar un ORM para cargar, cambiar y luego conservar registros no es eficiente. Mi proceso es algo como esto

1) el uso implementación temprana ORM, en mi caso NHibernate, exclusivamente

2) Dado que el desarrollo madura identificar problemas de rendimiento, que incluirá grandes cambios

3) Refactor ésos hacia fuera a SQL o SP enfoque

4) uso de comandos de actualización (objeto) para actualizar los objetos almacenados en caché,

Mi gran problema ha sido informar a otros clientes que la actualización se ha producido. En la mayoría de los casos, hemos aceptado que algunos clientes quedarán obsoletos, que es el caso con el uso de ORM estándar de todos modos, y luego verificar una marca de tiempo en la actualización/inserción.

2

Los ORM son ideales para un rápido desarrollo, pero tiene usted razón: no son eficientes. Son geniales porque no necesita pensar en los mecanismos subyacentes que convierten sus objetos en memoria en filas en tablas y viceversa. Sin embargo, muchas veces el ORM no elige el proceso más eficiente para hacerlo. Si realmente le importa el rendimiento de su aplicación, es mejor trabajar con un DBA para ayudarlo a diseñar la base de datos y ajustar sus consultas de manera adecuada. (o al menos comprende los conceptos básicos de SQL usted mismo)

0

ORMs simplemente no será tan eficiente como SQL hecho a mano. Período. Al igual que el ensamblador artesanal será más rápido que C#. Si la diferencia de rendimiento importa o no depende de muchas cosas. En algunos casos, el nivel más alto de abstracción que ofrecen los ORM puede valer más que un rendimiento potentamente más alto, en otros casos no.

Las relaciones de desplazamiento con el código de objeto pueden ser bastante buenas, pero como usted correctamente señala, existen problemas potenciales.

Dicho esto, personalmente veo que ORms es en gran parte una economía falsa. No me repetiré aquí, solo apunto a Using an ORM or plain SQL?

1

actualizaciones masivas son un diseño cuestionable. A veces parece necesario; en muchos casos, sin embargo, un mejor diseño de la aplicación puede eliminar la necesidad de actualizaciones masivas.

A menudo, alguna otra parte de la aplicación ya ha tocado cada objeto de a uno por vez; la actualización "masiva" debería haberse realizado en la otra parte de la aplicación.

En otros casos, la actualización es un preludio para el procesamiento en otro lugar. En este caso, la actualización debe ser parte del procesamiento posterior.

Mi estrategia de diseño general es refactorizar las aplicaciones para eliminar las actualizaciones masivas.

+0

A veces, la actualización masiva no es un problema de diseño, es una tarea. –

+0

@Candy Chiu: ¿Estás diciendo que no leíste la respuesta? O los ejemplos específicos en la respuesta no fueron lo suficientemente claros? ¿Qué significa tu comentario? Simplemente crear una actualización masiva porque alguien más dijo "crear una actualización masiva" no aborda la decisión de diseño cuestionable. –

+0

"actualizar los datos en el archivo db con algunos valores definidos por el usuario". En este caso, si se tocan varias filas, probablemente haya un problema de normalización. Las múltiples filas probablemente deberían haber sido extraídas en una tabla diferente para que una actualización de una sola fila hiciera el trabajo correctamente. –

Cuestiones relacionadas