Exactamente, lo implemente con rownum ya que es sobre oracle.
Muchisimas gracias por tu respuesta!
Saludos
----- Original Message -----
From: Gustavo Azcona
To: [email protected]
Sent: Thursday, November 26, 2009 12:43 PM
Subject: [puntonet] manejo de memoria en la paginacion
Roxana:
Paginación del GridView
Por defecto, cuando uno habilita la paginación del GridView esta paginación
no ocurre a nivel de datos. Esto significa, que si tengo 1000 registros y los
muestro de a 10, el GridView simplemente pagina esos regsitros mostrando de a
10, pero los 1000 registros ya fueron leídos de la BD, y dependiendo de cómo
hayas traído esos registros para pasarlos al GridView, puede que estés leyendo
una y otra vez esos 1000 registros.
Los controles DataSource como ObjectDataSource, SqlDataSource o
LinqDataSource puede ayudar un poco cacheando los 1000 registros y evitando
multiples consultas de la misma información a la BD.
Este mecanismo no es tan malo para muchos escenarios. Sin embargo, ¿por qué
traer 1000 registros si solo voy a mostrar 10?. Es decir, si voy a mostrar 10
registros, seguramente me interesa obtener de la BD solo esos 10 registros, ni
más ni menos.
Para lograr eso la paginación debe ocurrir a nivel de datos.
Consultas Paginadas
Escribir consultas SQL paginadas suele ser un poco duro. Además, para que la
grilla sepa cuantas páginas tiene que dibujar, necesitarás también una consulta
adicional para saber cuantos registros hay en total.
En SQL Server (creo desde SQL2005 en adelante), podrás utilizar la función
row_number() para escribir consultas que devuelven resultados en forma
paginada. Por ejemplo:
create
procedure [dbo].[Expense_GetSubmitters]
@TenantId
uniqueidentifier,
@StartRow int = null,
@MaxRows int = null
as
begin
with query as
(
select row_number() over (order by FullName) as Row, *
from AgentView as a
where a.TenantId = @TenantId
)
select *
from query
where (Row between @StartRow and @StartRow + @MaxRows)
end
Paginación con ADO.NET Entity Framework
Si estás usando LINQ2SQL o ADO.NET Entity Framework, puede que te interese
este post que escribí hace un tiempo:
http://gustavoazcona.blogspot.com/2009/03/paginacion-y-ordenamiento-del-lado.html
Aquí explico cómo implementar paginación y ordenamiento a nivel de datos
usando ADO.NET EF (con LINQ2SQL es idéntico).
Y aunque no estés usando ninguno de estos "ORMs", el post puede aclararte un
poco más acerca de la problemática de implementar paginación con GridView y
paginación a nivel de datos.
Espero que sirva.
Saludos, Gus
El 21 de noviembre de 2009 09:43, Roxana Leituz <[email protected]>
escribió:
Muchisimas gracias a todos por las respuestas!! Oscar: son registros de
solo lectura, no se deben tocar porque son informes de estado para un ente
público, pero el cliente hoy los genera ciegamente y quiere al menos "verlos"
antes de generar el txt. Pero son muchisimos. Voy a comenzar las pruebas.
Muchisimas gracias por las sugerencias,
Saludos
Roxana
----- Original Message -----
From: [email protected]
To: [email protected]
Sent: Friday, November 20, 2009 11:00 AM
Subject: [puntonet] manejo de memoria en la paginacion
Un ejercicio que se puede hacer en estos casos es poner un break point en
el método que maneja el evento de carga de la página, reproducir el evento que
se quiere conocer (seleccionar un item de la paginación, en este caso) y seguir
a partir del break point para ver qué tipo de consulta se hace. También podría
ser realizar un trace a la base de datos y ver qué consultas se realizan y
cuándo.
Pero yendo a lo más específico, me imagino que sí. No lo puedo asegurar
porque no sé cómo está construida tu página, pero el funcionamiento del grid
view es como lo estás describiendo.
Entre las soluciones posibles, podrías crear tu custom grid view que
realizara el query específico para cada página o podrías implemetar un patrón
DTO para almacenar la información de la tabla una sola vez y después bindear
tu grid o cualquier control con ese objeto o, un poco más simple, crear un
object data source que para cada página devuelva los registros necesarios
(podés encontrar cientos de ejemplos en Internet, te paso uno que encontré en
una búsqueda rápida en google:
http://www.dotnetcurry.com/ShowArticle.aspx?ID=267&AspxAutoDetectCookieSupport=1).
Tené en cuenta que la performance también está dada por el desempeño de
la consulta en la base de datos, si tenés acceso: revisá el diseño de las
tablas, el diseño de las consultas, los planes de ejecución y los índices
necesarios en las tablas.
C.S.
----- Original Message -----
From: Oscar Onorato [mailto:[email protected]]
To: [email protected]
Sent: Fri, 20 Nov 2009 01:21:01 -0300
Subject: [puntonet] manejo de memoria en la paginacion
Roxana,
Depende para qué estás recuperando esos registros. Si son para sólo
lectura es un tema y si son para editar es otro.
Sería bueno saber eso, por el tipo de consulta que vas a hacer. Más allá
del paginado.
Espero tu respuesta,
Saludos,
Oscar
El 19 de noviembre de 2009 22:35, Roxana Leituz
<[email protected]> escribió:
Hola!! queria saber si tienen idea de que manera utiliza asp.net el
tema de la paginación. cuando uso una grilla y habilito la paginación, el
sistema carga toda la tabla en memoria o va trayendo los registros en la medida
que los requiero?? pregunto esto porque necesito levantar una cantidad
importante de registros y saber si lo tengo que hacer "a mano" , usando
row_count por ejemplo. Se aceptan ideas..
Muchas gracias!!
--
Gustavo Azcona