Solución de optimización del rendimiento de EFCore: paginación

paginación compensada

Una forma común de implementar la paginación con una base de datos es con Skipy Take( OFFSETy LIMITSQL). Dado un tamaño de página de 10 resultados, se puede recuperar una tercera página usando EF Core de la siguiente manera:

var position = 20;
var nextPage = context.Posts
 .OrderBy(b => b.PostId)
 .Skip(position)
 .Take(10)
 .ToList();

Desafortunadamente, si bien esta técnica es muy intuitiva, tiene algunos inconvenientes graves:

  1. La base de datos todavía tiene que procesar las primeras 20 entradas, aunque no se devuelvan a la aplicación: esto crea una carga computacional potencialmente significativa que aumenta con el número de filas omitidas.
  2. Si se realizan actualizaciones al mismo tiempo, la paginación puede terminar omitiendo algunas entradas o mostrándolas dos veces. Por ejemplo, si el usuario elimina una entrada mientras pasa de la página 2 a la página 3, todo el conjunto de resultados "se mueve hacia arriba", omitiendo una entrada.
Paginación del conjunto de claves

La alternativa sugerida al uso de paginación basada en desplazamientos (a veces llamada paginación de conjunto de claves o paginación basada en búsquedasWHERE ) es simplemente usar la cláusula para omitir filas, en lugar de desplazamientos. Esto significa recordar el valor relevante de la última entrada obtenida (no su desplazamiento) y solicitar la siguiente línea después de esa línea. Por ejemplo, suponiendo que la última entrada de la última página que obtuvimos tiene un valor de ID de 55, simplemente hacemos lo siguiente:

var lastId = 55;
var nextPage = context.Posts
 .OrderBy(b => b.PostId)
 .Where(b => b.PostId > lastId)
 .Take(10)
 .ToList();

Suponiendo que los índices estén definidos PostId, esta consulta es muy eficiente e insensible a cualquier cambio simultáneo que ocurra mientras el valor de ID es bajo.

La paginación por conjunto de claves es adecuada para que los usuarios naveguen hacia adelante y hacia atrás, pero no admite una interfaz de paginación de acceso aleatorio, los usuarios pueden saltar a cualquier página específica. La paginación de acceso aleatorio requiere el uso de paginación desplazada, como se mencionó anteriormente: debido a las desventajas de la paginación desplazada, considere cuidadosamente si la paginación de acceso aleatorio es realmente necesaria o si la navegación a la siguiente página es suficiente. Si se requiere paginación de acceso aleatorio, una implementación sólida puede usar la paginación de conjunto de claves al navegar a la página siguiente/anterior y compensar la navegación al saltar a cualquier otra página.

múltiples claves de paginación

Cuando se utiliza la paginación por conjunto de claves, a menudo es necesario ordenar por varias propiedades. Por ejemplo, las siguientes páginas de consulta por fecha e ID:

var lastDate = new DateTime(2020, 1, 1);
var lastId = 55;
var nextPage = context.Posts
 .OrderBy(b => b.Date)
 .ThenBy(b => b.PostId)
 .Where(b => b.Date > lastDate || (b.Date == lastDate && b.PostId > lastId))
 .Take(10)
 .ToList();

Esto garantiza que la página siguiente continúa exactamente donde terminó la página anterior. Se pueden agregar cláusulas adicionales a medida que se agreguen más claves de clasificación.

Supongo que te gusta

Origin blog.csdn.net/gcf10080353/article/details/131716404
Recomendado
Clasificación