Paginación

18/07/2003 - 17:49 por Diego | Informe spam
Hola

He desarrollado un método con SQL server para paginar registros, sin
embargo, ando en busca del sistema más eficiente de paginación,

Podriamos entre todos compartir nuestros métodos de paginación?
El mio se basa en el uso de SQL, por ejemplo:


Select top 10 cd_tabla, descrip from tabla
where cd_tabla not in ( select top 20 cd_tabla from tabla )

Quien sabe como paginar de otra forma???

Gracias

Preguntas similare

Leer las respuestas

#6 TobleRone
24/07/2003 - 03:50 | Informe spam
El metodo de esa gente, lo que hace es liberar el data provider y volcar el
trabajo en el dbengine. Yo no hablé de ordenamientos. El método propone la
posibilidad de retomar un RANGO de registros (que en este caso seria desde
el primero hasta el último de la 'pagina' en cuestión), basandonos en un
identity.

El storedproc genera una tabla temporal, agregando un campo identity, y esa
tabla temporal tiene TODOS los registros de la tabla principal (en el caso
del ejemplo de la página). Por eso dije, si la tabla ya tiene identity,
tenes algo de ayuda. Aunque si es una tabla que haya tenido inserts y
deletes permanentes, el identity principal no te sirve de nada. En
conclusión, con ese método necesitas SI o SI generar una tabla temporal con
el resultado de la consulta Y una columna identity limpia, para retomar el
rango de registros de la 'pagina' que estes visualisando.

Si la tabla tiene muchos registros (digamos > 50k) el hecho de que al
data provider solo pasen los 20 o 30 registros (por que ya fueron
'digeridos' por la base de datos) es mejor que pensar en transportar los 50k
registros y paginar en ADO. Pero el método tiene sus downsides.

Lo que dije en el punto 2 es claro. Tu pagina ASP, dado su caracter
stateless, por cada 'paginación' que hagas, es necesario llamar al
storedproc en cuestión, y pasarle el # de página que queres ver. Si lo que
estas visualisando es una consulta compleja (digamos, varias tablas, joins,
unions, etc, o en el peor caso... sql dinámico), por cada 'paginación', o
sea, cada ejecución del StoredProc, el dbengine crea una tabla temporal,
ejecuta el query (sea cual fuere o cuan complejo fuere), vuelca los datos en
esa tabla y por último le devuelve a tu .asp el rango de registros.

Espero que se haya entendido, cualquier consulta, hacemela llegar

Saludos


"Manuel Vera" escribió en el mensaje
news:Olm$
Aclaratorias y dudas en el texto.

TobleRone wrote in message
news:usV9i#
El método de la gente de 4guysfromrolla es muy ingenioso. Pero tiene


algunos
detalles negativos.

Hay 2 casos:

1) Cuando es necesario paginar sobre TODOS los registros de la tabla. En
dicho caso, si la tabla tiene una columna Identity, la solución es
totalmente trivial. Usas ese StoredProc y listo. Si la tabla no tiene


Ident,
es necesario crear una tabla temporaria.
R: No necesariamente si existe un Identity en la tabla yo necesito mostrar
ese ordenamiento o prioridad. Quizás necesite un ordenamiento por fecha,
alfabético u otro y no el orden de insersión de los registros como tal.

2) Cuando es necesario paginar sobre una consulta compleja. O sea,


ejecutar
una consulta compleja, que devuelve varios registros, y paginar sobre


ellos.
Ahi tendriamos el mismo problema. El db engine tiene que crear una temp
table por cada conexión que abras, ejecutar el query, llenar la temp


table,
y ejecutar el SP sobre ella para saber que pagina debe devolver.
R: No veo aquí nada claro. No te entendí. Por lo general todas las
consultas, simples o complejas, devuelven conjuntos de registros o varios
registros. Por lo general se abre una sola conexión a la base de datos,


por
lo tanto solo hay que abrir una sola conexión. Si se crean tablas


temporales
en SQL Server cuando la consulta compleja así lo requiere, pero es usando


el
método de 4guysfromrolla como pasando el string SQL directamnete al
Execute(). La verdad no entendí tu posición respecto al punto q marcaste
como 2.

Ya he probado todos estos escenarios, y creanme en el caso 2, no hay
ninguna diferencia de performance entre lo que dice ahi, y llevar toda la
consulta hacia un Recordset ADO y paginar desde ahi.

Saludos

"Manuel Vera" escribió en el mensaje
news:
> Este me parece mejor y más optimizado. Véanlo aquí...
> http://www.4guysfromrolla.com/webte...99-1.shtml
>
> Mi opinión se basa en que se evita enviar, por ejemplo, los 300 mil
> registros del server hacia ADO para ADO los filtre. En vez de eso, el
mismo
> SQL Server filtra los registros que quiere, de 10 en 10, 20 en 20 o como
te
> guste. Así, solamente se devuelve ese conjunto desde SQL hacia el ADO,
> ganando en performance, pues viaja menos data a traves de la red.
>
> El ejemplo usando ADO para paginar es bueno para utilizarlo con Access,
pero
> con SQL puedes mejorarlo con el que sale en el link de arriba.
>
> Saludos
> MV
>
> Webmaster Tiendainformaticatotal.com wrote in
> message news:
> ale pos aki lo tienes
>
> sql="SELECT * FROM tabla"
> RS.open sql,conexion,3,1
> rspMax = CInt(rsprod.RecordCount)
> if rspmax <> "0" then
> 'nº de registros a mostrar por pagina
> mostrar = 6
> rsprod.PageSize = mostrar
> rsprod.CacheSize = mostrar
> cant_registros = 0
> if Request.Querystring("pg")="" then
> pag_actual=1
> else
> pag_actual=CInt(Request.Querystring("pg"))
> end if
> pag_totales = rsprod.PageCount
> if pag_actual < 1 then
> pag_actual = 1
> end if
> if pag_actual > pag_totales then
> pag_actual = pag_totales
> end if
> rsprod.AbsolutePage = pag_actual
> end if
> do while not rsprod.EOF and cant_registros < mostrar
> response.write RS("columna")
> cant_registros = cant_registros +1
> RS.movenext
> loop
> RS.close
> conexion.close
> if pag_totales=0 then
> Response.Write("<br><br><br><br><br><br>No se han encontrado


noticias.")
> else
> if pag_actual > 1 then
> Response.Write("<A HREF=web.asp?pg="& pag_actual-1 &">")
> end if
> Response.write ("Atras")
> if pag_actual > 1 then
> Response.Write("</A>")
> end if
> Response.Write(" | Página " & Pag_actual & " de " & pag_totales &" | ")
> if pag_actual < pag_totales then
> Response.Write("<A HREF=web.asp?pg="& pag_actual+1 &">")
> end if
> Response.write ("Siguiente")
> if pag_actual > 1 then
> Response.Write("</A>")
> end if
> end if
>
> Diego escribió en el mensaje de noticias
>
> > Es decir mostrar registros de 10 en 10 de una tabla con 300.000
> > registros
> > Quisiera saber que estan utilizando para hacer esto.
> >
> >
> >
> > "Webmaster Tiendainformaticatotal.com"


escribió
> en
> > el mensaje news:
> > > que es lo quieres hacer realmente, paginar x registros en cada


pagina
de
> > tu
> > > consulta SQL
> > >
> > >
> > >
> > > Diego escribió en el mensaje de noticias
> > >
> > > > Hola
> > > >
> > > > He desarrollado un método con SQL server para paginar registros,


sin
> > > > embargo, ando en busca del sistema más eficiente de paginación,
> > > >
> > > > Podriamos entre todos compartir nuestros métodos de paginación?
> > > > El mio se basa en el uso de SQL, por ejemplo:
> > > >
> > > >
> > > > Select top 10 cd_tabla, descrip from tabla
> > > > where cd_tabla not in ( select top 20 cd_tabla from tabla )
> > > >
> > > > Quien sabe como paginar de otra forma???
> > > >
> > > > Gracias
> > > >
> > > >
> > >
> > >
> >
> >
>
>
>
>




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida