11 julio 2008

Primer contacto serio con Linq

He hecho mi primer proyectito con Linq to SQL, se trata de una pasarela de sincronización entre 2 sistemas: nuestra BD en SQL y un AS/400 que nos genera archivos de texto. Os cuento mi experiencia, la principal conclusión es que no me ofrece un buen rendimiento (y eso que he conseguido mejorarlo varias veces, pero aún así no es suficiente) y por eso quiero compartirlo por si hay algo que se pueda hacer de otra forma (no con SqlCommand, eso ya sé hacerlo, he probado en este proyecto con Linq por aprender y porque realmente el rendimiento no es necesario, se ejecuta durante la noche).
Veréis: para la prueba de fuego he hecho una carga de 125.000 artículos que se escribían en 2 tablas. Pues bien, la principal pregunta es: ¿se hace todo con un DataContext abierto, o voy cerrando y abriendo para cada artículo? Es que mantengo en memoria muchas entidades para acelerar las búsquedas, y si establezco una de esas entidades en un nuevo artículo, como se guarda en otro DataContext distinto a donde se cargó, pues dice que no es aplicable. Así que sólo me funciona manteniendo abierto el mismo DataContext desde el principio. Lo cual no sería problemático si no fuera porque el rendimiento se va degradando conforme más se usa el DataContext, parece que al llevar el seguimiento de tantas entidades se ralentiza. Comienza a actualizar a más de 30 artículos por segundo, y cuando lleva 40.000 artículos escritos va por 3 artículos por segundo, lo cual es de pena (cada artículo son 2 INSERT).
La otra cuestión es acerca de los INSERT que genera Linq: es especialmente lento porque el comando Insert espera a recibir la respuesta de la identidad del nuevo registro insertado. ¿Hay alguna forma en Linq de generar nuevas entidades pero no recuperar su Id? Esto lo veo mucho más improbable, y no he encontrado nada al respecto, sólo críticas a la falta de procesos por lote en Linq pero no referentes a esta cuestión puntual (sino a UPDATEs de múltiples registros).

Mientras no resolvamos la cuestión de si uno o varios DataContext, y en el segundo caso de cómo usar una entidad de un DataContext sobre otro, no veo viable utilizar Linq para otros proyectos de mayor envergadura. Supongo que todas estas cuestiones serán equivalentes en Linq to Entities, que es lo que realmente aspiramos a utilizar.

Etiquetas: