foxty [trabajo original]
ha estado estudiando recientemente cómo escribir un algoritmo de paginación alto-pequeño. Lo he resuelto y las ideas son las siguientes:
Primero, es necesario que haya un campo de numeración automática (ID) en la base de datos. Luego, en la primera visita, extraiga todos los registros, personalice el número de registros en cada página PageSize, calcule el número de páginas y luego cree una matriz unidimensional PageId (PageCount) basada en el número de páginas (0. ) guarda las condiciones de prueba iniciales del registro y luego, correspondiente a cada elemento, guarda el código de límite de ID correspondiente a cada página (
1. Código de límite de ID: si la secuencia de registros de ID del registro de la base de datos es la siguiente: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Suponiendo que necesita ordenar por ID, PageSize = 5, Pagecount = 4, PageId(4)
Los valores de la matriz PageId son PageId(0) = 1, PageId(1) = 5, PageId(2) = 10, PageId(3) = 15, PageId(4) = 16
Al acceder a la i-ésima página, busque directamente los registros entre [PageId(i-1), PageId(i)). Esto garantiza que solo se recuperen los registros de PageSize cada vez.
Supongamos que necesita ordenar por ID en orden inverso,
Los valores de la matriz PageId son PageId(0) = 16, PageId(1) = 12, PageId(2) = 7, PageId(3) = 2, PageId(4) = 1. Al acceder al i-ésimo página, busque directamente el ID que pertenece a [PageId(i-1), PageId(i))
)
Guarde la matriz PageId() en Application() para facilitar el acceso, de modo que Application() solo se inicialice la primera vez que se accede al buscapersonas. La parte del código es la siguiente: (en lo sucesivo, el nuevo programa)
<%
Tiempo1 = Temporizador()
Dim Conn
Establecer conexión = Server.CreateObject ("Adodb.Connection")
Conn.open "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
'www.downcodes.com
Página oscura, PageCounts, PageId, PageList
Dim Rs, SQL
Dim IsInit,i
IsInit = False 'La bandera se utiliza para determinar si la aplicación ("PageId") está inicializada
PageList = 20 'Establece 20 datos que se mostrarán en cada página
Establecer Rs = Server.CreateObject ("Adodb.Recordset")
Página = Request.QueryString("Página") 'Tenga en cuenta que es necesario verificar el tipo del número de página
Si IsEmpty(Application("PageId")) Entonces 'Si la aplicación("PageId") aún no se ha inicializado, inicialícela primero
Response.Write("¡Iniciar aplicación!<br>")
Sql = "Seleccionar * De prueba Ordenar por ID Desc" 'Supongamos que esto está ordenado en orden inverso por ID
Rs.open Sql,Conn,1,1 'Obtiene el objeto del conjunto de registros
Si no (Rs.Eof o Rs.Bof) entonces
Rs.PageSize = PageList 'Establece el número de registros por página
Conteos de páginas = Rs.Conteo de páginas
ReDim PageId(PageCounts) 'Redefinir la matriz PageId
For i = 0 To PageCounts 'Comience a asignar valores a la matriz PageId()
Si Rs.eof entonces salga por
ID de página(i) = Rs("ID")
Rs.Move(Lista de páginas)
Próximo
Rs.MoveLast
PageId(PageCounts) = Rs("ID")
Aplicación.Lock()
Aplicación ("Id. de página") = Id. de página
Aplicación.Desbloquear()
Terminar si
Rs.Cerrar
Terminar si
IdStart = Clng(Aplicación("PageId"))(Página-1))
IdEnd = Clng(Aplicación("PageId"))(Página))
Sql = "Seleccione * de la prueba donde id<="&IdStart&" e id>"&IdEnd&" "
Rs.open Sql,Conn,1,1
Si bien no es Rs.eof
Respuesta.Escribir(rs(0)&"--"&rs(1))
Rs.MoverSiguiente
Encaminarse a
Rs.Cerrar
Establecer Rs = Nada
Conexión.Cerrar
SetConn=Nada
Para i = 1 a Ubound(Aplicación("PageId"))
Respuesta.Write("<a href='Test1.asp?Page="&i&"'>"&i&"</a> ")
Próximo
Tiempo2 = Temporizador()
Respuesta.Escribir("<br>"&(Tiempo2-Tiempo1)*1000)
'Aplicación.Contenido.Remove("Id. De Página")
%>
El código de paginación tradicional es el siguiente: (en lo sucesivo, el programa antiguo)
<%
Tiempo1 = Temporizador()
Dim Conn
Establecer conexión = Server.CreateObject ("Adodb.Connection")
Conn.open "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
Página oscura, recuentos de páginas, lista de páginas
Dim Rs, SQL
Lista de páginas = 20
Página = Solicitud.QueryString( "Página")
Establecer Rs = Server.CreateObject ("Adodb.Recordset")
Sql = "Seleccionar * del pedido de prueba por id desc"
Rs.Open Sql,Conn,1,1
Si Página = "" Entonces Página = 1
Si no (Rs.eof o Rs.Bof) entonces
Rs.PageSize = Lista de páginas
Conteos de páginas = Rs.Conteo de páginas
Rs.AbsolutePage = Página
Terminar si
Para i = 1 a PageList
Si Rs.eof entonces salga por
Respuesta.Escribir(Rs(0)&"-----"&Rs(1)&"<br>")
Rs.MoverSiguiente
próximo
Para i = 1 a PageCounts
Respuesta.Write("<a href='Test.asp?Page="&i&"'>"&i&"</a> ")
Próximo
Tiempo2 = Temporizador()
Respuesta.Escribir("<br>"&(Tiempo2-Tiempo1)*1000)
%>
De hecho, la idea general es crear una matriz global de Aplicación ("PageId") y cada elemento guarda el rango de ID del registro en la página. Por ejemplo, Aplicación ("PageId") (0) guarda el ID de. el primer elemento. Luego Application("PageId")(1) guarda el primer ID de la página siguiente... y así sucesivamente. Cuando necesite acceder a la i-ésima página, simplemente busque el ID directamente en [Application(). "PageId")(i-1), Application("i") ) De esta manera, solo necesita buscar la cantidad requerida de registros cada vez, en lugar de buscar todos los registros cada vez. Sin embargo, este método se utiliza en. el primer acceso Cuando es necesario crear la aplicación de matriz ("PageId"), es un poco más lento. Cuando se accede por enésima vez (N>1), la velocidad es casi 10 veces más rápida. Utilicé los dos programas anteriores. prueba:
1. Hay 32.000 registros en la base de datos. El programa antiguo tarda unos 500 milisegundos en acceder a una página. El nuevo programa sólo alcanza este tiempo durante el primer acceso y luego sólo tarda unos 55 milisegundos cada vez.
2. Aumente los datos a 64.000 registros. El programa antiguo tarda unos 1.000 milisegundos en acceder a una página. El nuevo programa también alcanza este nivel cuando accede a ella por primera vez. A partir de entonces, sigue tardando unos 55 milisegundos.
3. Aumente los datos a 128.000 registros. El programa antiguo tarda unos 1900 milisegundos en acceder a una página, el nuevo programa tarda unos 2300 milisegundos en acceder a una página por primera vez y luego cada acceso sólo tarda unos 70 milisegundos.
Lo que hay que tener en cuenta aquí es que cada vez que se modifica la base de datos, es necesario reasignar la Aplicación ("PageId")
Experiencia de investigación: (En primer lugar, gracias Ye Zi (DVBBS) por su experiencia). El programa de paginación incorporado, Rs.RecordCount, consume muchos recursos. A su vez, se estima que Rs.PageCount... también consume recursos, y el efecto de usar Rs.GetRows() también mejora significativamente.
En comparación, la velocidad y la eficiencia del algoritmo de hoja son relativamente altas cuando los registros son relativamente altos. Pero no es muy estable, a veces (rara vez) salta de unos 30 ms a 1-200 ms. Posteriormente, la eficiencia cae significativamente a 50-80 milisegundos, y más tarde la eficiencia disminuye. La eficiencia del nuevo algoritmo es relativamente baja por primera vez, alrededor de 500 milisegundos, pero es relativamente estable más tarde, generalmente es de alrededor de 50 milisegundos y, a medida que cambia el número de registros en la biblioteca, esta velocidad sigue siendo la misma. Nada cambiará. La próxima vez intentaré combinar Ye Ye con mi algoritmo, pero el algoritmo de Ye Ye es realmente muy bueno y versátil. Sólo puedo usarlo para chatear.