Foxty [Originalarbeit]
hat kürzlich untersucht, wie man einen High-Small-Paging-Algorithmus schreibt. Ich habe es geklärt und die Ideen sind wie folgt:
Zunächst muss in der Datenbank ein automatisches Nummerierungsfeld (ID) vorhanden sein. Nehmen Sie dann beim ersten Besuch alle Datensätze heraus, passen Sie die Anzahl der Datensätze auf jeder Seite an (PageSize), berechnen Sie die Anzahl der Seiten und erstellen Sie dann ein eindimensionales Array PageId (PageCount) basierend auf der Anzahl der Seiten ) speichert die anfänglichen Testbedingungen des Datensatzes und speichert dann entsprechend jedem Element den ID-Grenzcode, der jeder Seite entspricht (
1. ID-Grenzcode: Wenn die Datensatzsequenz der Datenbankdatensatz-ID wie folgt lautet: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Angenommen, Sie müssen nach ID sortieren, PageSize = 5, Pagecount = 4, PageId(4)
Die Werte des Arrays PageId sind PageId(0) = 1, PageId(1) = 5, PageId(2) = 10, PageId(3) = 15, PageId(4) = 16
Suchen Sie beim Zugriff auf die i-te Seite direkt nach den Datensätzen zwischen [PageId(i-1), PageId(i)). Dadurch wird sichergestellt, dass jedes Mal nur PageSize-Datensätze abgerufen werden.
Angenommen, Sie müssen in umgekehrter Reihenfolge nach ID sortieren.
Die Werte des Arrays PageId sind PageId(0) = 16, PageId(1) = 12, PageId(2) = 7, PageId(3) = 2, PageId(4) = 1. Beim Zugriff auf das i-te Seite, finden Sie direkt die ID, die zu [ PageId(i-1) , PageId(i) ) gehört
)
Speichern Sie das Array PageId() in Application() für einen einfachen Zugriff, sodass Application() nur beim ersten Zugriff auf den Pager initialisiert wird. Der Codeteil lautet wie folgt: (im Folgenden als neues Programm bezeichnet)
<%
Zeit1 = Timer()
Dim Conn
Setze Conn = Server.CreateObject("Adodb.Connection")
Conn.open "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
„www.downcodes.com
Seite, Seitenanzahl, Seiten-ID, Seitenliste abblenden
Dim Rs,Sql
Dim IsInit,i
IsInit = False 'Das Flag wird verwendet, um zu bestimmen, ob die Anwendung ("PageId") initialisiert ist
PageList = 20 'Legen Sie 20 Datenelemente fest, die auf jeder Seite angezeigt werden sollen
Setze Rs = Server.CreateObject("Adodb.Recordset")
Page = Request.QueryString("Page") 'Beachten Sie, dass die Seitenzahl auf Typ überprüft werden muss
If IsEmpty(Application("PageId")) Then 'Wenn Application("PageId") noch nicht initialisiert wurde, initialisieren Sie es zuerst
Response.Write("Init app!<br>")
Sql = "Select * From test Order By Id Desc" 'Angenommen, dies ist in umgekehrter Reihenfolge nach ID sortiert
Rs.open Sql,Conn,1,1 'Holen Sie sich das Recordset-Objekt
Wenn nicht (Rs.Eof oder Rs.Bof), dann
Rs.PageSize = PageList 'Legen Sie die Anzahl der Datensätze pro Seite fest
PageCounts = Rs.PageCount
ReDim PageId(PageCounts) 'Definieren Sie das Array PageId neu
For i = 0 To PageCounts 'Beginnen Sie mit der Zuweisung von Werten zum Array PageId()
Wenn Rs.eof, dann beenden Sie For
PageId(i) = Rs("ID")
Rs.Move(PageList)
Nächste
Rs.MoveLast
PageId(PageCounts) = Rs("ID")
Application.Lock()
Anwendung("PageId") = Seiten-ID
Application.UnLock()
Ende wenn
Rs.Schließen
Ende wenn
IdStart = Clng(Application("PageId")(Page-1))
IdEnd = Clng(Application("PageId")(Page))
Sql = „Wählen Sie * aus dem Test aus, wobei id<="&IdStart&" und id>"&IdEnd&" "
Rs.open Sql,Conn,1,1
Während nicht Rs.eof
Response.Write(rs(0)&"--"&rs(1))
Rs.MoveNext
Wend
Rs.Schließen
Setze Rs = Nichts
Verbind.Schließen
SetConn=Nichts
Für i = 1 To Ubound(Application("PageId"))
Response.Write("<a href='Test1.asp?Page="&i&"'>"&i&"</a> ")
Nächste
Zeit2 = Timer()
Response.Write("<br>"&(Time2-Time1)*1000)
'Application.Contents.Remove("PageId")
%>
Der herkömmliche Paging-Code lautet wie folgt: (im Folgenden als altes Programm bezeichnet)
<%
Zeit1 = Timer()
Dim Conn
Setze Conn = Server.CreateObject("Adodb.Connection")
Conn.open "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
Seite, Seitenanzahl, Seitenliste abblenden
Dim Rs,Sql
Seitenliste = 20
Seite = Request.QueryString( "Seite" )
Setze Rs = Server.CreateObject("Adodb.Recordset")
Sql = „Wählen Sie * aus der Testreihenfolge nach ID desc aus“
Rs.Open Sql,Conn,1,1
Wenn Seite = "", dann Seite = 1
Wenn nicht (Rs.eof oder Rs.Bof), dann
Rs.PageSize = Seitenliste
PageCounts = Rs.PageCount
Rs.AbsolutePage = Seite
Ende wenn
Für i = 1 bis PageList
Wenn Rs.eof, dann beenden Sie For
Response.Write(Rs(0)&"-----"&Rs(1)&"<br>")
Rs.MoveNext
nächste
Für i = 1 To PageCounts
Response.Write("<a href='Test.asp?Page="&i&"'>"&i&"</a> ")
Nächste
Zeit2 = Timer()
Response.Write("<br>"&(Time2-Time1)*1000)
%>
Tatsächlich besteht die Gesamtidee darin, ein globales Array von Application("PageId") zu erstellen und jedes Element den ID-Bereich des Datensatzes auf der Seite zu speichern. Beispielsweise speichert Application("PageId")(0) die ID von das erste Element. Dann speichert Application("PageId")(1) die erste ID der nächsten Seite ... und so weiter. Wenn Sie auf die i-te Seite zugreifen müssen, suchen Sie einfach direkt in [Application( "PageId")(i- 1) , Application("i") ) Auf diese Weise müssen Sie jedes Mal nur die erforderliche Anzahl von Datensätzen durchsuchen, anstatt jedes Mal alle Datensätze zu durchsuchen. Diese Methode wird jedoch verwendet Beim ersten Zugriff ist die Array-Anwendung („PageId“) etwas langsamer. Beim N-ten Zugriff (N>1) ist die Geschwindigkeit fast zehnmal höher prüfen:
1. Es gibt 32.000 Datensätze in der Datenbank. Das alte Programm benötigt etwa 500 Millisekunden, um auf eine Seite zuzugreifen. Das neue Programm erreicht diese Zeit nur beim ersten Zugriff und benötigt dann jeweils nur etwa 55 Millisekunden.
2. Erhöhen Sie die Daten auf 64.000 Datensätze. Das alte Programm benötigt beim ersten Zugriff ebenfalls etwa 1.000 Millisekunden.
3. Erhöhen Sie die Daten auf 128.000 Datensätze. Das alte Programm benötigt etwa 1900 Millisekunden, um auf eine Seite zuzugreifen, das neue Programm benötigt etwa 2300 Millisekunden, um zum ersten Mal auf eine Seite zuzugreifen, und dann dauert jeder Zugriff nur etwa 70 Millisekunden.
Hier ist zu beachten, dass bei jeder Änderung der Datenbank die Anwendung („PageId“) neu zugewiesen werden muss.
Forschungserfahrung: (Zunächst vielen Dank an Ye Zi (DVBBS) für Ihre Erfahrung.) Versuchen Sie, das nicht zu verwenden Das integrierte Paging-Programm Rs.RecordCount ist sehr ressourcenintensiv. Es wird wiederum geschätzt, dass Rs.PageCount... ebenfalls Ressourcen verbraucht und die Wirkung der Verwendung von Rs.GetRows() ebenfalls erheblich verbessert wird.
Im Vergleich sind Geschwindigkeit und Effizienz des Blattalgorithmus relativ hoch, wenn die Datensätze relativ hoch sind. Aber es ist nicht sehr stabil, manchmal (selten) springt es von etwa 30 ms auf 1-200 ms. Danach sinkt die Effizienz deutlich auf 50-80 Millisekunden, je später wird die Effizienz geringer. Die Effizienz des neuen Algorithmus ist zunächst relativ gering, etwa 500 Millisekunden, aber sie ist relativ stabil. Später beträgt sie im Allgemeinen etwa 50 Millisekunden, und wenn sich die Anzahl der Datensätze in der Bibliothek ändert, bleibt diese Geschwindigkeit gleich. Nichts wird sich ändern. Das nächste Mal werde ich versuchen, Ye Ye mit meinem Algorithmus zu kombinieren, aber der Algorithmus von Ye Ye ist tatsächlich sehr gut und vielseitig. Ich kann es nur zum Chatten verwenden.