28 diciembre 2010

Limitar las consultas desde Visual - "Ver más registros..."

Bueno, mas de medio año de haber dejado literalmente en el olvido este blog, retomo la pantalla de "publicar entrada", para compartir con ustedes un tip, acerca de como manejo el tema de Optimizar consultas usando un DataTable y poblarlo haciendo uso de un DataAdapter.




Cuando trabajamos con tablas con grandes cantidades de registros y necesitamos presentar información en un DataGridView, por ejemplo, ya habrán visto que el poblado del DataTable se puede tardar unos segundos, en algunos casos, ésta cantidad de tiempo es considerada aceptable, pero en ocasiones, como dice el refran "el tiempo es oro"; es necesario recurrir a agotar todo lo posible para mostrar información en el menor tiempo posible.


Quiza dirán que aquí depende del usuario, recriminando el uso incorrecto de la opción de Buscar; por no buscar cosas específicas sino, por criterios muy generales.


Esta vez, veremos como implementar la opción de "Ver más registros" de dos formas. Y limitar los registros mostrados en la consulta


Es algo sumamente sencillo y pequeño en código, pero con grandes posibilidades en uso.


Opción 1: usando Visual Basic


Cuando hagan el Fill del DataAdapter, pongan esto:
Private _posinicial, _limit as Integer
_posinicial=0 ' esta será la que utilizaremos para saltar de fila en fila
_limit=100 ' cuanto es lo máximo permitido para mostrar en cada bloque
Private _conn As Npgsql.NpgsqlConnection
Private _tabla As DataTable
Private _adapter As Npgsql.NpgsqlDataAdapter

_adapter = New NpgsqlDataAdapter("select * from foo", _conn)
_tabla = New DataTable
_adapter.Fill(_posinicial, _limit, _tabla)
Con esto estamos haciendo que sólo se agreguen a la Tabla "_tabla" los primieros 100 registros obtenidos en nuestra consulta; y agregando a la posición inicial la cantidad de registros que se han visualizado


Luego para implementar la filosofía "Ver más..." hay que simplemente trabajar con esto:
_posinicial+=_limit 'para actualizar la posicion inicial según lo último mostrado
_adapter.Fill(_posinicial, _limit, _tabla)
Éstas tres líneas pueden estar en el botón "Ver más...", esto muestra una cantidad igual de registros y reescribimos el valor de la posición inicial, para que siga agregando donde se quedo.


Al llegar al máximo, obviamente dejará de presentar registros, tampoco esperen que se invente filas y las agregue hasta que dejen de dar clic en "Ver más..."


Opción 2: usando POSTGRES


Utilizando SQL es más rápido, porque la primera opción realmente hace la consulta total a la tabla, no se cuál es la pila de los desarrolladores de Microsoft, porque la idea principal es el performance, al menos para mí, pero con la forma anterior, siempre hace toda la consulta, la guarda en memoria y la va mostrando poco a poco. Por eso para mí esta es la mejor manera:


_adapter = New NpgsqlDataAdapter("select * from foo order by codigo limit" & _limit & " ofsset " & _posinicial, _conn)
_tabla = New DataTable
_adapter.Fill(_tabla)
Para referencias, visiten el siguiente link en el sitio oficial de postgres
Limit y Offset en Postgresql


Para el botón "Ver Más..." ahora sería lo siguiente:
_posinicial+=_limit 'para actualizar la posicion inicial según lo último mostrado
_adapter.SelectCommand.CommandText="select * from foo order by codigo limit" & _limit & " ofsset " & _posinicial
_adapter.Fill(_tabla)
Lo que hacemos es nada más actualizar la posición inicial (Offset en postgres) para mostrar los siguientes registros y; reemplazar el SelectCommand del DataAdapter, luego hacer nuevamente el Fill al DataTable y así, adherir los siguientes registros del resultset. 


En este caso es muy importante utilizar un ORDER BY, para que tengamos mejores resultados.




Cordialmente,
Juan Ramirez
El Salvador

2 comentarios:

  1. como puedo hacer una consulta para que me traiga datos de diferentes tablas relacionadas en postgresql desde visual estudio en un formulario..??? se puede hacer esto, como.?

    ResponderEliminar
  2. es sencillo no es nada diferente de como haces la consulta normal....

    primero debes hacer la consulta en sql

    select *
    from tabla1 as a, tabla2 as b
    where a.campo_comun=b.campo_comun


    luego en mi ejemplo reemplazas el script anterior en esta linea

    _adapter = New NpgsqlDataAdapter("SCRIPT QUE PUSE ANTES", _conn)

    y listo!

    ResponderEliminar