¿Cómo implementar la paginación de manera efectiva?

9

Tengo una consulta de base de datos que podría dar lugar a un gran conjunto de resultados. El cliente que muestra los datos recibe los datos a través de la red, por lo que la idea era minimizar la cantidad de datos transferidos recuperando solo los primeros 50 resultados de la base de datos y enviándolos al cliente. Luego ofreceré la posibilidad de saltar a la segunda página para recuperar los próximos 50 resultados, etc. (algo similar a lo que ofrece Google, por ejemplo)

La pregunta es cuál es la forma efectiva de implementar la paginación. Quiero asegurarme de que mssql use la memoria caché tanto como sea posible y que no se ejecute lo mismo una vez más cada vez que cambie la paginación.

Hay más clientes que consultan la base de datos al mismo tiempo. Motor sql usado: MS SQL 2005

Mis ideas fueron:

  • Utilice sql statemenst preparado para garantizar el intercambio del plan de ejecución
  • use la variable ROW_COUNT para recuperar solo las filas necesarias

¿Pero es realmente la forma más efectiva? ¿O cree que sería mejor recuperar todo el conjunto de resultados e implementar la paginación en el código que envía los datos al cliente?

Gracias por tus consejos!

Saludos, Tomás

Tomás Walek
fuente

Respuestas:

7

La consulta se ejecutará cada vez. SQL Server no almacena en caché los resultados.

La paginación adecuada no se implementará hasta SQL Server 2011, pero hasta entonces sus opciones (como identificó) son:

  • ROW_NUMBER () y consultas bajo demanda
  • almacenamiento en caché del cliente

También se ejecutará una instrucción SQL preparada cada vez.

Si tiene un cliente gordo, el almacenamiento en caché es local para el cliente. Esto está bien, a menos que tenga millones de blobs, por ejemplo.

En nuestro cliente web mostramos todos los resultados, pero solo mostramos los 100 mejores y tenemos un botón "Mostrar todo" que expande un DIV oculto con filas 101+. No almacenamos en caché en el servidor web y no ofrecemos paginación.

gbn
fuente
Gracias. ¿Y cuál es el mejor enfoque si el usuario cambia algunos criterios de clasificación? ¿Debo ejecutar la consulta una vez más con los nuevos criterios u ordenar los resultados en el cliente?
Tomas Walek
1
Yo ordenaría en el cliente. Los datos ya están ahí. Sí, una base de datos es buena para clasificar, pero si los datos son los mismos y están disponibles, ¿por qué hacer otra llamada? Utilizamos un complemento jQuery para permitir la clasificación en el navegador :-)
gbn
4

Depende de tu entorno. Configuraría una prueba usando ambos métodos y vería cuál funciona mejor para usted. Personalmente, me gustaría paginar en el servidor. Menos datos a través del cable y menos datos en la RAM del cliente, mejor. Si puede controlar las especificaciones de la máquina del cliente, todo el tráfico se realiza a través de una LAN no saturada y los clientes siempre navegan por varias páginas rápidamente, entonces es posible que desee buscar en el cliente.

Eric Humphrey - lotsahelp
fuente
Gracias. Realmente necesito ambos: la comunicación entre el servidor y el cliente se implementa en WCF, por lo que hay un tamaño máximo para un mensaje y si el conjunto resultante excede este tamaño, debo enviar más mensajes para transferir los datos completos al cliente. A los clientes también les gusta pasar páginas rápidamente ... :(
Tomas Walek