Sidebar

Para evitar que los queries extraigan miles de registros que no puede consultar un usuario en una pantalla, es necesario paginarlas y transferir solo aquellos registros que se van a desplegar.

Uno de los problemas que generan las aplicaciones cuando ejecutan consultas sobre la base de datos, es extraer miles de registros y enviarlos al cliente. Este proceso suele ser muy pesado para la red y su tiempo de ejecución la mayoría de las veces es muy grande. Esto pasa cuando los programadores permiten hacer consultas completas de tablas sin agregar algún tipo de filtro. Aunque este tipo de consultas no deberían de existir, muchas veces se hacen por requerimiento del cliente, pero podemos mejorar su tiempo de ejecución si transferimos la información por bloques aunque la base de datos tenga que volver a ejecutar una consulta.

El ejecutar nuevamente la consulta suele ser muy rápido dentro del manejador de base de datos, lo que lleva más tiempo es enviar la información al cliente, de ahí la necesidad de paginar los resultados. He visto que ejecutar el query localmente en el Server mostrando todos los registros puede ser rápido si se tiene suficiente memoria y un buen raid 10, pero si es ejecutado desde un cliente puede tardar 10 veces más, esto lleva al usuario muchas veces a volver a ejecutar la consulta si la aplicación se lo permite, pensando que su consulta no fue ejecutada, generando una serie de queries muy pesados y saturando la red, por consecuencia todos los usuarios experimentan lentitud en el sistema.

A continuación muestro dos maneras en la que podemos llevar a cabo la paginación.

Este ejemplo, lo lleve a cabo con la tabla de usuarios de Oracle, pero pueden usar cualquiera.


Método 1:

select username, user_id from 
(select salida.*, rownum r from
    (select username, user_id 
    from dba_users order by username) salida
where rownum <= registro-fin)
where r >= registro-inicio;

Método 2:

select username, user_id from 
    (select username, user_id, row_number() over (order by username) r
    from dba_users)
where r between :registro-inicio and :registro-fin

 


Tips BD