foxty [オリジナル作品] は
最近、ハイスモールページングアルゴリズムの書き方を研究しており、それを整理したところ、次のようなアイデアになりました。
まず、データベースに自動番号付けフィールド (ID) が必要です。次に、最初の訪問時にすべてのレコードを取り出し、各ページのレコード数 PageSize をカスタマイズし、ページ数を計算して、ページ数に基づいて 1 次元配列 PageId (PageCount) を作成します。 ) レコードの初期テスト条件を保存し、各要素に対応して各ページに対応する ID 境界コードを保存します (
1. ID 境界コード: データベース レコード ID レコードの順序が次の場合: 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16
ID、PageSize = 5、Pagecount = 4、PageId(4) で並べ替える必要があると仮定します。
配列 PageId の値は、PageId(0) = 1、PageId(1) = 5、PageId(2) = 10、PageId(3) = 15、PageId(4) = 16 です。
i 番目のページにアクセスするときは、[PageId(i-1), PageId(i))] の間のレコードを直接検索します。これにより、毎回 PageSize レコードのみが取得されます。
ID で逆順に並べ替える必要があるとします。
配列PageIdの値は、PageId(0) = 16、PageId(1) = 12、PageId(2) = 7、PageId(3) = 2、PageId(4) = 1です。i番目にアクセスする場合ページ、直接 [ PageId(i-1) , PageId(i) )
]
に属する ID を検索します
簡単にアクセスできるように、配列 PageId() を Application() に保存します。これにより、Application() はページャーが初めてアクセスされたときにのみ初期化されます。コード部分は次のとおりです: (以下、新しいプログラムと呼びます)
<%
Time1 = タイマー()
ディム・コン
Set Conn = Server.CreateObject("Adodb.Connection")
Conn.open "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
「www.downcodes.com」
薄暗いページ、ページ数、ページ ID、ページリスト
ディムRs、SQL
ディム IsInit、i
IsInit = False 'このフラグは、アプリケーション (「PageId」) が初期化されているかどうかを決定するために使用されます
PageList = 20 '各ページに表示するデータを20個設定します
Set Rs = Server.CreateObject("Adodb.Recordset")
Page = Request.QueryString("Page") 'ページ番号のタイプをチェックする必要があることに注意してください
If IsEmpty(Application("PageId")) then 'Application("PageId") がまだ初期化されていない場合は、最初に初期化します
Response.Write("アプリを初期化します!<br>")
Sql = "Select * From test Order By Id Desc" 'これは ID によって逆順に並べ替えられていると仮定します
Rs.open Sql,Conn,1,1 'レコードセット オブジェクトを取得します
そうでない場合 (Rs.Eof または Rs.Bof)
Rs.PageSize = PageList 'ページあたりのレコード数を設定します
ページ数 = Rs.ページ数
ReDim PageId(PageCounts) '配列 PageId を再定義します
For i = 0 To PageCounts '配列への値の代入を開始 PageId()
Rs.eof の場合は終了します
PageId(i) = Rs("ID")
Rs.Move(ページリスト)
次
Rs.MoveLast
PageId(PageCounts) = Rs("ID")
Application.Lock()
アプリケーション("ページID") = ページID
Application.UnLock()
終了の場合
Rs.Close
終了の場合
IdStart = Clng(Application("PageId")(Page-1))
IdEnd = Clng(Application("PageId")(ページ))
Sql = "テストから * を選択します。ここで id<="&IdStart&" および id>"&IdEnd&" "
Rs.open SQL,Conn,1,1
Rs.eofではない間
Response.Write(rs(0)&"--"&rs(1))
Rs.ムーブネクスト
ウェン
Rs.Close
Rs = 何も設定しない
接続を閉じる
SetConn=なし
For i = 1 To Ubound(Application("PageId"))
Response.Write("<a href='Test1.asp?Page="&i&"'>"&i&"</a> ")
次
Time2 = タイマー()
Response.Write("<br>"&(Time2-Time1)*1000)
'Application.Contents.Remove("PageId")
%>
従来のページング コードは次のとおりです: (以下、古いプログラムと呼びます)
<%
Time1 = タイマー()
ディム・コン
Set Conn = Server.CreateObject("Adodb.Connection")
Conn.open "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
薄暗いページ、ページ数、ページリスト
ディムRs、SQL
ページリスト = 20
ページ = Request.QueryString( "ページ" )
Set Rs = Server.CreateObject("Adodb.Recordset")
Sql = "ID 説明によるテスト順序から * を選択"
Rs.Open SQL、Conn、1、1
ページ = "" の場合、ページ = 1
そうでない場合 ( Rs.eof または Rs.Bof )
Rs.PageSize = ページリスト
ページ数 = Rs.ページ数
Rs.AbsolutePage = ページ
終了の場合
i = 1 の場合は PageList へ
Rs.eof の場合は終了します
Response.Write(Rs(0)&"-----"&Rs(1)&"<br>")
Rs.ムーブネクスト
次
For i = 1 から PageCounts まで
Response.Write("<a href='Test.asp?Page="&i&">"&i&"</a> ")
次
Time2 = タイマー()
Response.Write("<br>"&(Time2-Time1)*1000)
%>
実際、全体的な考え方は Application("PageId") のグローバル配列を作成することであり、各要素はページ内のレコードの ID 範囲を保存します。たとえば、Application("PageId")(0) はその ID を保存します。次に、Application("PageId")(1) で次のページの最初の ID を保存します。以下同様に、i 番目のページにアクセスする必要がある場合は、[Application() で ID を直接検索します。 "PageId")(i- 1) , Application("i") ) この方法では、毎回すべてのレコードを検索するのではなく、毎回必要な数のレコードを検索するだけで済みます。ただし、このメソッドは次の場合に使用されます。最初のアクセスでは、配列 Application("PageId") を作成する必要があるため、少し遅くなりますが、N 回目 (N>1) でアクセスすると、速度はほぼ 10 倍速くなります。テスト:
1. データベースには 32,000 のレコードがあります。古いプログラムでは 1 ページにアクセスするのに約 500 ミリ秒かかりますが、新しいプログラムでは最初のアクセス時にのみこの時間に達し、その後は毎回約 55 ミリ秒しかかかりません。
2. データを 64,000 レコードに増やします。古いプログラムでは、1 ページにアクセスするのに約 1,000 ミリ秒かかります。新しいプログラムでも、その後は毎回約 55 ミリ秒かかります。
3. データを 128,000 レコードに増やすと、古いプログラムでは 1 ページにアクセスするのに約 1900 ミリ秒かかりますが、新しいプログラムでは最初に 1 ページにアクセスするのに約 2300 ミリ秒かかり、その後は各アクセスにかかる時間はわずか約 70 ミリ秒になります。
ここで注意する必要があるのは、データベースが変更されるたびに、Application("PageId") を再割り当てする必要があるということです。
研究体験: (まず、経験を提供してくれた Ye Zi (DVBBS) に感謝します)組み込みのページング プログラムである Rs.RecordCount はリソースを非常に消費します。また、Rs.PageCount... もリソースを消費すると推定され、Rs.GetRows() を使用する効果も大幅に向上します。
比較すると、レコードが比較的高い場合、リーフ アルゴリズムの速度と効率は比較的高くなります。ただし、安定性はあまり高くなく、(まれに)約 30 ミリ秒から 1 ~ 200 ミリ秒に跳ね上がることがあります。その後、効率は 50 ~ 80 ミリ秒まで大幅に低下し、遅くなるほど効率は低くなります。新しいアルゴリズムの効率は、最初は比較的低く、約 500 ミリ秒ですが、その後は通常約 50 ミリ秒で比較的安定しており、ライブラリ内のレコードの数が変化しても、この速度は変わりません。何も変わりません。次回は Ye Ye と私のアルゴリズムを組み合わせてみますが、Ye Ye のアルゴリズムは確かに非常に優れており、多用途です。チャットにのみ使用できます。