この記事の目的は、ビッグデータのページブラウジングを実現し、速度を最適化することです。
Web アプリケーションを構築するには、ページング ブラウズ機能が不可欠です。この問題は、長い間最も一般的な問題でもあり、その中には、ASP プログラム用のページング アルゴリズムが多数存在します。 ado オブジェクトの PageSize 属性。レコードの総数に基づいてページを計算し、レコード セットにジャンプして出力します。ページング データを実装するストアド プロシージャを記述する方法もあります。以下に、実際のプロジェクトで非常に高速なページング アルゴリズムを紹介します。
SQL (TOP と自動番号付けを使用して実装)
ページスクリプト(ブラウザフォールバック機能)
環境:
IIS/SQLサーバー/アクセス
テーブル構造:
テーブルコンテンツテーブルを作成(
自動番号 IDENTITY(int, 1,1) が null ではありません。
分類コード<I>var</I>char(20) null、
Title<I>var</I>char(255) NULL、
コンテンツ<I>var</I>char(4000) null、
時刻日時 null、
)
実装原則:
このテーブルは、自動番号付けフィールドを使用して設定されています。このフィールドの特徴は、レコードを削除した後もフィールドが依然として「流動的」なままであることを含め、重複しない整形を生成することです (注: 通常、システム テーブルの構築では、これが行われます)。番号を自由に管理できないため、フィールドはほとんど使用されませんが、ここでは主に記事内で番号管理のためのコードを省略したいために使用されます。
ページネーション:
次に、最初のステップは、ページのデータをクエリすることです。レコードが 100 個あり、1 ページに 20 個のレコードが使用されている場合、通常のページング アルゴリズムは「ページの総数 = レコードの総数をページングの制御数で割った値です。ページの合計数に 1 つを加えた余りが存在します。このアプローチでは、すべてのレコードからなる大規模なレコード セットを生成する必要があります。そのため、ストアド プロシージャのページング アルゴリズムを使用することを提案する人もいます。前者は ASP です。私はよくストアド プロシージャを作成しますが、私の考えによれば、ストアド プロシージャを作成するのは完全に冗長であることがわかります。
SQL に慣れていない人の多くは、Top 変更キーワードの役割を知っています。たとえば、 select TOP 1 * from table1 -- このようにして、Table1 テーブルから 1 つのレコードのみを含むレコード セットが返されます。ページング最適化の目的は、過度に大規模なレコード セットの生成を避けることです。TOP を通じて完全に制御できるようになりました。クエリ テーブルは、コンテンツ テーブルから上位 20 個の自動番号付け、タイトル、コンテンツ、および時間を選択する必要があります。
しかし、依然として問題はあります。それは、Top が特定のページを自動的に配置して出力することは不可能であり、この節は特定の条件に従って正しいコンテンツを出力するように設計されています。注: レコードのソート順は非常に重要であり、これがこのアルゴリズムの成功または失敗を決定します。
ここでデモンストレーションするのは、逆順に配置する DESC 方式です。たとえば、Web サイトのソフトウェア更新では、最新の更新が最初に配置されます。これは逆順方式です。
OK、実際のコードを見てみましょう。まず、それがスタートページであるかどうかを判断する必要があります。
dim strSQL,i,endID,isBeginPage
const Cnt_PageSize = 20 'レコードの各ページのサイズを定義します
'ブラウザから渡された Page パラメータの値を確認して、次のページに入る操作であるかどうかを判断します
isBeginPage = isEmpty(request("ページ")) または request("ページ")="" または request("ページ")<>"next"
'ここがページングの核心です
if isBeginPage then 'スタートページの場合
'Query = 分類コードがパラメーター flbm と等しいレコードを逆順にリストし、最初の Cnt_PageSize ペンのみをリストします (Cnt_PageSize は 20 などの定数定義です)
strSQL = "select TOP " & Cnt_pageSize & " 分類エンコーディング = '" & TRIM(SQLEncode(request("flbm"))) & "' 自動番号付け記述による順序付けのコンテンツ テーブルからの自動番号付け、タイトル、コンテンツ、時間"
else 'スタートページでない場合
if request("Page")="next" then 'これはコードのパフォーマンスを向上させるためにここに書かれています。パラメータが next の場合、ページのコンテンツを取得することを意味します。
'Query = 分類コードがパラメーター flbm に等しく、自動番号 endID (endID もパラメーター) より小さいレコードをリストし、それらを逆順に並べ替えて、最初の Cnt_PageSize ペンのみをリストします (Cnt_PageSize は定数定義 (20 など)
strSQL = "select TOP " & Cnt_pageSize & " 分類エンコーディング = '" & TRIM(SQLEncode(request("flbm"))) & "' および自動番号付け<" & request のコンテンツ テーブルからの自動番号付け、タイトル、コンテンツ、時刻("endID") & "自動番号記述による順序"
次の場合に終了
end if
'データ接続を開いて SQL を実行し、レコード セットを作成します
set rs = Cnn.Execute(strSQL)
if not rs.Eof then 'Eof かどうかを判断するためにここに書き込みます。これは必須ではありませんが、ここでは特別な意味があります。
call TableTitle 'これはテーブルタグを作成するために使用される自作の関数です
call beginTr 'ここに、i=0 から rs.fields.Count-1 までのテーブルを作成する tr マークがあります
'レコードセットのフィールドを走査します
call AddCol(rs(i).name) '出力フィールド名
次
endTr を呼び出します
'レコードセットの内容をループして出力します
i=0 から rs.fields.Count-1 に対して
beginTr を呼び出します
。
AddRow(ASPEncode(rs(i).value)) を呼び出す
次
通話終了Tr
endID = rs("自動番号付け") 'ここでは、各出力の自動番号付け値を保存します
rs.次へ移動
ウェン
call TableBottom 'ここまでは、レコードセットのすべての内容を出力するだけです
'ここにページ送りマークを出力します、vbaIIFは自作関数です
プロトタイプは <I>関数</I> vbaIIF(a,b,c) です。
もしそうなら
vbaIIF=b
それ以外
vbaIIF =c
終了する場合
<I>関数</I>を終了します
前のページの実装は、ブラウザの関数history.back(1)をスクリプトで呼び出すことで実現されており、ページに戻る際にサーバー側でデータを再生成する必要がなく、速度を考慮する必要がありません。 。
ホーム ページでは、前のページへのリンクは無効である必要があります。これは、ホーム ページの場合は、vbaIIF(isBeginPage, "disabled", "") によってタグに追加されます。ホーム ページではない場合は、閲覧ページをロールバックするために使用されるスクリプト コマンド、history.back (1) を追加します。
次のページには、Page パラメータと endID パラメータが渡され、次のページのアクションを示します。endID は現在のレコード セットの終了番号を示し、次のページはここからページ分割されます。
response.Write("<a href=""#"" onclick=""java<I>script</I>:" & vbaIIF(isBeginPage,"","history.back(1);") & "" " " & vbaIIF(isBeginPage," disabled ","") & ">前のページ</a>|<a href=""TypeOptions.asp?flbm=" & request("flbm") & "&Page=next&endID = " & endID & """>次のページ</a>")
それ以外
ここで、レコードセットが空かどうかを判断することで、最後のページまでページをめくり続ける問題を解決できます。
そうでない場合はBeginPageです
'それが空のレコードであり、開始ページではないかを判断し、ロールバック ページのスクリプトを生成します。その結果、ページに入った後、自動的に前のページに戻ります。
response.Write "<I>script</I> language=java<I>script</I>>" & vbCrlf
Response.Write "history.back(1);"
Response.Write "</<I>スクリプト</I>>"
応答.終了
else '開始ページ レコードの場合は空になり、コンテンツがないことを示すメッセージが表示されます。
Response.Write 「<font color=blue>このカテゴリにはコンテンツがありません</font>」
終了する場合
endIf
概要: フロントエンド スクリプトと SQL クエリのスキルにより、高性能のページング プログラムがシンプルかつ高速に
なります
。注: フォーラムでは HTML 文字が制限されているため、重要な記号が含まれています
。中国語の大文字。