2010-04-07 26 views
6

Tengo problemas para entender cómo evitar la selección n + 1 en jpa o hibernación.¿Cómo puedo resolver el problema N + 1 Selects?

De lo que he leído, está la 'combinación izquierda ir', pero no estoy seguro de si todavía funciona con más de una lista (OneToMany) ..

es posible que alguien me lo explique, o dar me un enlace con una explicación completa clara, por favor?

Lo siento si esto es una pregunta noob, pero no puedo encontrar un artículo de clara real o documento sobre este tema.

Gracias

+0

Comprender este problema es crucial para trabajar con Hibernate. Incluso he desarrollado un pequeño librry para identiying este tema en las pruebas de unidad: https://github.com/bedrin/jdbc-sniffer/ – bedrin

Respuesta

6

Aparte de la subselección (s) se unen, también se puede utilizar. Esto se traduce en 2 consultas de ser ejecutado (o en general m + 1, si tiene m listas), pero las escalas bien para un gran número de listas también, a diferencia de join.

Con la obtención conjunta, si obtiene 2 tablas (o listas) con su entidad, obtendrá un producto cartesiano , es decir, todas las combinaciones de pares de filas de las dos tablas. Si las tablas son grandes, el resultado puede ser enorme, p. si ambas tablas tienen 1000 filas, ¡el producto cartesiano contiene 1 millón de filas!

Una mejor alternativa para estos casos es utilizar subselects. En este caso, emitiría 2 selecciones, una para cada tabla, en la parte superior de la selección principal (que carga la entidad padre), por lo que en total cargará 1 + 100 + 100 filas con 3 consultas.

Para el registro, el mismo con la carga diferida resultaría en 201 selecciona separadas, cada carga de una sola fila.

Actualización: He aquí algunos ejemplos:

+2

podría proporcionar un ejemplo HQL corto para la solución subselects? me ayudaría a resolverlo, creo. Gracias :) –

+0

@Maxime Agregué algunos enlaces, espero que estos ayuden :-) –

+0

genial gracias, puedo trabajar con eso :) –

Cuestiones relacionadas