sql >> Base de Datos >  >> RDS >> PostgreSQL

@BatchSize ¿un uso inteligente o estúpido?

  1. Sí, @BatchSize está destinado a ser utilizado con asociaciones perezosas.
  2. Hibernate ejecutará varias declaraciones en la mayoría de las situaciones de todos modos, incluso si el recuento de proxies/colecciones no inicializados es menor que el tamaño de lote especificado. Ver esta respuesta para más detalles. Además, las consultas más ligeras en comparación con las menos grandes pueden contribuir positivamente al rendimiento general del sistema.
  3. @BatchSize a nivel de clase significa que el tamaño de lote especificado para la entidad se aplicará a todos los @*ToOne asociaciones perezosas con esa entidad. Ver el ejemplo con la Person entidad en la documentación.

Las preguntas/respuestas vinculadas que proporcionó están más preocupadas por la necesidad de optimización y la carga diferida en general. Por supuesto, también se aplican aquí, pero no están relacionados solo con la carga por lotes, que es solo uno de los enfoques posibles.

Otra cosa importante se relaciona con la carga ansiosa que se menciona en las respuestas vinculadas y que sugiere que si una propiedad siempre se usa, entonces puede obtener un mejor rendimiento al usar la carga ansiosa. En general, esto no es cierto para colecciones y en muchas situaciones para asociaciones individuales.

Por ejemplo, suponga que tiene la siguiente entidad para la cual bs y cs son siempre se usa cuando A se utiliza.

public class A {
  @OneToMany
  private Collection<B> bs;

  @OneToMany
  private Collection<C> cs;
}

Cargando ansiosamente bs y cs obviamente sufre de un problema de selección N+1 si no los une en una sola consulta. Pero si los une en una sola consulta, por ejemplo como:

select a from A
  left join fetch a.bs
  left join fetch a.cs

luego crea producto cartesiano completo entre bs y cs y devolviendo count(a.bs) x count(a.cs) filas en el conjunto de resultados para cada a que se leen uno por uno y se ensamblan en las entidades de A y sus colecciones de bs y cs .

La recuperación por lotes sería muy óptima en esta situación, porque primero leería A s, luego bs y luego cs , lo que da como resultado más consultas pero con una cantidad total de datos mucho menor que se transfiere desde la base de datos. Además, las consultas separadas son mucho más simples que una consulta grande con uniones y son más fáciles de ejecutar y optimizar para la base de datos.