foxty [œuvre originale]
a récemment étudié comment écrire un algorithme de pagination de grande taille. Je l'ai réglé et les idées sont les suivantes :
Tout d’abord, il doit y avoir un champ de numérotation automatique (ID) dans la base de données. Ensuite, lors de la première visite, supprimez tous les enregistrements, personnalisez le nombre d'enregistrements sur chaque page PageSize, calculez le nombre de pages, puis créez un tableau unidimensionnel PageId (PageCount) basé sur le nombre de pages PageId (0. ) enregistre les conditions de test initiales de l'enregistrement, puis correspondant à chaque élément, enregistre le code limite ID correspondant à chaque page (
1. Code limite d'identification : si la séquence d'enregistrement de l'ID d'enregistrement de la base de données est la suivante : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
En supposant que vous deviez trier par ID, PageSize = 5, Pagecount = 4, PageId(4)
Les valeurs du tableau PageId sont PageId(0) = 1, PageId(1) = 5, PageId(2) = 10, PageId(3) = 15, PageId(4) = 16
Lorsque vous accédez à la ième page, recherchez directement les enregistrements entre [PageId(i-1), PageId(i)). Cela garantit que seuls les enregistrements PageSize sont récupérés à chaque fois.
Supposons que vous deviez trier par ID dans l'ordre inverse,
Les valeurs du tableau PageId sont PageId(0) = 16, PageId(1) = 12, PageId(2) = 7, PageId(3) = 2, PageId(4) = 1. Lors de l'accès au i-ème page, Rechercher directement l'ID appartenant à [ PageId(i-1) , PageId(i) )
)
Enregistrez le tableau PageId() dans Application() pour un accès facile, afin qu'Application() ne soit initialisé que lors du premier accès au pager. La partie code est la suivante : (ci-après dénommé le nouveau programme)
<%
Temps1 = Minuterie()
Dim Conn
Définir Conn = Server.CreateObject("Adodb.Connection")
Conn.open "Driver={Pilote MicroSoft Access (*.mdb)};Dbq="&Server.MapPath("db.mdb")
'www.downcodes.com
Dim Page, Nombre de pages, PageId, PageList
Dim Rs,Sql
Dim IsInit,i
IsInit = False 'L'indicateur est utilisé pour déterminer si l'application ("PageId") est initialisée
PageList = 20 'Définissez 20 éléments de données à afficher sur chaque page
Définir Rs = Server.CreateObject("Adodb.Recordset")
Page = Request.QueryString("Page") 'Notez que le numéro de page doit être vérifié pour le type
If IsEmpty(Application("PageId")) Then 'Si Application("PageId") n'a pas encore été initialisée, initialisez-la d'abord
Response.Write("Initier l'application !<br>")
Sql = "Select * From test Order By Id Desc" 'Supposons que cela soit trié dans l'ordre inverse par ID
Rs.open Sql,Conn,1,1 'Obtenir l'objet recordset
Si non (Rs.Eof ou Rs.Bof) Alors
Rs.PageSize = PageList 'Définir le nombre d'enregistrements par page
Nombre de pages = Rs.PageCount
ReDim PageId(PageCounts) 'Redéfinir le tableau PageId
Pour i = 0 To PageCounts 'Commencez à attribuer des valeurs au tableau PageId()
Si Rs.eof alors quittez pour
ID de page(i) = Rs("ID")
Rs.Move (Liste des pages)
Suivant
Rs.MoveLast
PageId(PageCounts) = Rs("ID")
Application.Lock()
Application("PageId") = PageId
Application.UnLock()
Fin si
Rs.Fermer
Fin si
IdStart = Clng(Application("PageId")(Page-1))
IdEnd = Clng(Application("PageId")(Page))
Sql = "Sélectionnez * à partir du test où id<="&IdStart&" et id>"&IdEnd&" "
Rs.open SQL,Conn,1,1
Bien que ce ne soit pas Rs.eof
Réponse.Write(rs(0)&"--"&rs(1))
Rs.MoveNext
Wende
Rs.Fermer
Définir Rs = Rien
Conn.Fermer
SetConn=Rien
Pour i = 1 Vers Ubound(Application("PageId"))
Réponse.Write("<a href='Test1.asp?Page="&i&"'>"&i&"</a> ")
Suivant
Temps2 = Minuterie()
Réponse.Write("<br>"&(Time2-Time1)*1000)
'Application.Contents.Remove("PageId")
%>
Le code de pagination traditionnel est le suivant : (ci-après dénommé l'ancien programme)
<%
Temps1 = Minuterie()
Dim Conn
Définir Conn = Server.CreateObject("Adodb.Connection")
Conn.open "Driver={Pilote MicroSoft Access (*.mdb)};Dbq="&Server.MapPath("db.mdb")
Dim Page, Nombre de pages, Liste de pages
Dim Rs,Sql
Liste des pages = 20
Page = Request.QueryString( "Page" )
Définir Rs = Server.CreateObject("Adodb.Recordset")
Sql = "Sélectionner * dans la commande de test par identifiant desc"
Rs.Open SQL,Conn,1,1
Si Page = "" Alors Page = 1
Si non (Rs.eof ou Rs.Bof) alors
Rs.PageSize = Liste de pages
Nombre de pages = Rs.PageCount
Rs.AbsolutePage = Page
Fin si
Pour i = 1 à PageList
Si Rs.eof alors quittez pour
Réponse.Write(Rs(0)&"-----"&Rs(1)&"<br>")
Rs.MoveNext
suivant
Pour i = 1 au nombre de pages
Réponse.Write("<a href='Test.asp?Page="&i&"'>"&i&"</a> ")
Suivant
Temps2 = Minuterie()
Réponse.Write("<br>"&(Time2-Time1)*1000)
%>
En fait, l'idée générale est de créer un tableau global de Application("PageId"), et chaque élément enregistre la plage d'ID de l'enregistrement dans la page. Par exemple, Application("PageId")(0) enregistre l'ID de. le premier élément. Ensuite, Application("PageId")(1) enregistre le premier ID de la page suivante... et ainsi de suite. Lorsque vous devez accéder à la i-ème page, recherchez simplement l'ID directement dans [Application(. "PageId") (i- 1) , Application("i") ) De cette façon, vous n'avez besoin de rechercher que le nombre requis d'enregistrements à chaque fois, au lieu de rechercher tous les enregistrements à chaque fois. Cependant, cette méthode est utilisée sur. le premier accès Lorsque le tableau Application("PageId") doit être créé, il est un peu plus lent lors de l'accès pour la Nième fois (N>1), la vitesse est près de 10 fois plus rapide. J'ai utilisé les deux programmes ci-dessus pour. test:
1. Il y a 32 000 enregistrements dans la base de données. L'ancien programme met environ 500 millisecondes pour accéder à une page. Le nouveau programme n'atteint ce délai que lors du premier accès, puis ne prend qu'environ 55 millisecondes à chaque fois.
2. Augmentez les données à 64 000 enregistrements. L'ancien programme met environ 1 000 millisecondes pour accéder à une page. Le nouveau programme atteint également ce niveau lors de son premier accès. Il reste ensuite à environ 55 millisecondes.
3. Augmentez les données à 128 000 enregistrements. L'ancien programme prend environ 1 900 millisecondes pour accéder à une page, le nouveau programme prend environ 2 300 millisecondes pour accéder à une page pour la première fois, puis chaque accès ne prend qu'environ 70 millisecondes.
Ce qu'il faut noter ici, c'est qu'à chaque fois que la base de données est modifiée, Application("PageId") doit être réaffectée !
Expérience de recherche : (Tout d'abord, merci Ye Zi (DVBBS) pour votre expérience) Essayez de ne pas utiliser le programme de pagination intégré, Rs.RecordCount est très consommateur de ressources. À son tour, on estime que Rs.PageCount... consomme également des ressources, et l'effet de l'utilisation de Rs.GetRows() est également considérablement amélioré.
Après comparaison, la vitesse et l'efficacité de l'algorithme feuille sont relativement élevées lorsque les enregistrements sont relativement élevés. Mais ce n'est pas très stable, parfois (rarement) ça passe d'environ 30 ms à 1-200 ms. Ensuite, l'efficacité chute considérablement jusqu'à 50-80 millisecondes, et plus tard, l'efficacité diminue. L'efficacité du nouvel algorithme est relativement faible pour la première fois, environ 500 millisecondes, mais elle est relativement stable plus tard, elle est généralement d'environ 50 millisecondes, et à mesure que le nombre d'enregistrements dans la bibliothèque change, cette vitesse reste la même. Rien ne changera. La prochaine fois, j'essaierai de combiner Ye Ye avec mon algorithme, mais l'algorithme de Ye Ye est en effet très bon et polyvalent. Je ne peux l'utiliser que pour discuter.