jul 14 2009

Paginación Eficiente SQL Server

Category: Artículos | Web | Windowsjayson_quintero @ 09:30

Algunas veces los programadores nos encontramos con un problema a la hora de mostrar en un contenedor de datos (GridView) una gran cantidad de registros procedentes de una base de datos  y entonces es cuando nos decidimos por paginar usando los recursos que nos brinda el control. Pero el uso de esos recursos, no son optimos, lo que nos lleva a consumir grandes recursos del sistema, ya que estos controles cargan los datos en memoria para luego administrarlos y dar la sensacion de paginacion. Esto nos lleva  a minimizar el impacto que esto tiene sobre el o los servidores, tratando de usar una manera mas optima, dando como resultado el uso eficiente de los recursos. Es por esto que se le dice Paginación Eficiente.

La base de datos Mysql le facilita el trabajo de paginación a los programadores PHP usando la clausula LIMIT que es un punto que le dice a la base de datos que le traiga desde una fila especifica hasta otra fila especifica.

Información de la Clausula LIMIT: http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

En Sql Server 2000 no se podia hacer esto y todo se hacia complejo en store procedures creando tablas temporales para poder cargar datos y entonces devolver de esa tabla temporal los datos por medio de un RowID generado en código.

En Sql Server 2005 después de años de trabajo la función ROW_NUMBER() que trabaja dandole un id único a las filas de datos en memoria y permitiendo apuntar a esos id únicos en el query como hace Mysql con la clausula LIMIT permite traer parte de un todo apuntando a los numeros de las filas.

Información de ROW_NUMBER: http://msdn.microsoft.com/es-es/library/ms186734.aspx 

Este Artículo esta enfocado en definir el método de paginación eficiente y compararlo con otros métodos, también en como se logra alcanzar gracias a el método ROW_NUMBER() que implementa SQL Server 2005. Podrán ver un ejemplo de su uso dentro de un store procedures.

 

Qué es una paginación eficiente:

Una paginación eficiente es aquella que es capaz de presentar al usuario final una página en el menor tiempo posible y consumiendo la mínima cantidad posible de recursos. Estos recursos son:

Ancho de banda de la red. Deberíamos consumir el mínimo ancho de banda posible, para ello, cada vez que se solicita una página, sólo debe viajar por la red la página solicitada. En algunas malas implementaciones de la paginación, cada vez que se solicita una página, circula por la red la totalidad de los registros, esto es inaceptable en la mayoría de los casos.

Procesamiento del servidor. Deberíamos diseñar la paginación de manera que el servidor de base de datos pueda proporcionar la página solicitada con el mínimo consumo de procesador, memoria y acceso a disco. Para ello deberemos crear los índices adecuados y diseñar correctamente la manera de acceder a los datos.

Procesamiento en el cliente. En la aplicación cliente deberíamos minimizar el consumo de procesador y memoria. Si la aplicación cliente consume demasiados recursos, tendremos aquí el cuello de botella.

Una vez definido el problema y especificado el impacto que este tiene, procedere a dar una solucion: Dice que hay dos tipos de Navegacion, simple y completa. la simle es ir de pagina en pagina y la completa es la que puedes ir a cualquier pagina.

Yo siempre utilizo la paginacion completa. Utilizaremos SqlServer 2005, crearemos un Store Procedure. Para esto necesito 3 datos importantes:

1. Inicio del registro: la cual llamare @StartItemIndex (int)

2. cantidad Maxima a Mostrar @MaxItemsCount (int)

3.La cantidad de registro completo a paginas: para esto siempre hago (solo la primera vez) select count(*) from table where xxxxx y regreso el valor para almacenarlo en el objeto a administrar paginacion.

Ejemplo de store procedure:

Create PROCEDURE [dbo].[usp_DetailGroup_ByFilter_Pagination]
@AgencyCode varchar(50),
@StartItemIndex int,
@MaxItemsCount int,
@Paginado char(1) --este lo uso para usar el mismo store para regresar cuantos registros tiene

AS

BEGIN

SET NOCOUNT ON;


if @Paginado = '1'
Begin

select [CRS], [PCC], [PNR], [PASSENGER NAME]
from

(

select [CRS], [pseudocity] as [PCC], [PNR], [PassengerName] as [PASSENGER NAME],

ROW_NUMBER() over(order by [PCC]) as OrderIndex --aqui uso un campo que servira para ordenar los registros

from  tabla1
where CountryCode Like @Country

 


)

as OrderIndexRow

where OrderIndex > @StartItemIndex and OrderIndex <= @StartItemIndex+@MaxItemsCount

order by CountryCode

end

else

begin

select count(*) as Counts from table 1 where CountryCode Like @Country

end

end

Un índice apropiado puede acelerar espectacularmente una consulta y la paginación no es una excepción.
Con este store procedure , podras controlar a travez de los parametros del store, que registros mostrar.

Mas adelante colocare en este sitio, un control diseñado para paginar un gridview de manera eficiente.

Tags:

Actualmente calificado con 5.0 por 1 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Comentarios