SQLサーバーのページングメソッドとは何ですか?

醉折花枝作酒筹
リリース: 2021-08-06 09:22:00
転載
3828 人が閲覧しました

この記事では、SQL Server 2012 バージョンを使用した SQL Server のページング方法について説明します。以下では、pageIndex はページ数を表し、pageSize は 1 ページに含まれるレコードを表します。以下に具体的な例を示します。クエリ ページ 2 を設定し、各ページには 10 レコードが含まれます。

まず、SQL サーバーのページングと MySQL のページングの違いについて説明します。MySQL のページングは、limit (pageIndex-1) と pageSize を使用することで直接完了できます。ただし、SQL サーバーには、limit キーワードがありません。 、limit のようなもののみ。トップのキーワード。したがって、ページングはさらに面倒です。

私が知っている SQL サーバー ページングのタイプは 4 つだけです: トリプル ループ、max (主キー) の使用、row_number キーワードの使用、offset/fetch next キーワードの使用 (インターネット上で他の人のメソッドを収集して要約したもの)現時点ではこれら 4 つの方法のみが存在するはずです。他の方法はこの変形に基づいています)。

クエリ対象の Student テーブルの部分レコード

SQLサーバーのページングメソッドとは何ですか?

#方法 1: トリプル ループ

アイデア

最初最初の 20 ページを取得し、次に逆の順序で取得し、最初の 10 レコードを逆の順序で取得すると、ページングに必要なデータを取得できますが、順序が逆になります。その後、逆の順序で返すことも、停止することもできます。ソートし、ソートのためにフロントエンドに直接渡します。

このタイプと考えられる別のメソッドがあります。コードはここには載せません。最初に最初の 10 レコードをクエリし、次に使用するアイデアについてだけ説明します。 「not in」を選択してこれら 10 件のレコードを除外し、「Inquire」を実行します。

コードの実装

-- 设置执行时间开始,用来查看性能的 set statistics time on ; -- 分页查询(通用型) select * from (select top pageSize * from (select top (pageIndex*pageSize) * from student order by sNo asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。 as temp_sum_student order by sNo desc ) temp_order order by sNo asc -- 分页查询第2页,每页有10条记录 select * from (select top 10 * from (select top 20 * from student order by sNo asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。 as temp_sum_student order by sNo desc ) temp_order order by sNo asc ;
ログイン後にコピー

クエリ結果と時間

SQLサーバーのページングメソッドとは何ですか?

SQLサーバーのページングメソッドとは何ですか?

方法 2: max を使用する (プライマリkey)

まず、最初の 11 行のレコードを先頭にし、次に max (id) を使用して最大の ID を取得し、このテーブルの最初の 10 レコードを再クエリします。ただし、条件を追加する必要があります。 id>max(id)。

コードの実装

set statistics time on; -- 分页查询(通用型) select top pageSize * from student where sNo>= (select max(sNo) from (select top ((pageIndex-1)*pageSize+1) sNo from student order by sNo asc) temp_max_ids) order by sNo; -- 分页查询第2页,每页有10条记录 select top 10 * from student where sNo>= (select max(sNo) from (select top 11 sNo from student order by sNo asc) temp_max_ids) order by sNo;
ログイン後にコピー

クエリの結果と時間

SQLサーバーのページングメソッドとは何ですか?

SQLサーバーのページングメソッドとは何ですか?

##方法 3: row_number キーワードを使用する

row_number() over(order by id) 関数を直接使用して行数を計算し、対応する行番号を選択して返しますが、このキーワードは SQL Server 2005 以降でのみ使用できます。

SQL 実装

set statistics time on; -- 分页查询(通用型) select top pageSize * from (select row_number() over(order by sno asc) as rownumber,* from student) temp_row where rownumber>((pageIndex-1)*pageSize); set statistics time on; -- 分页查询第2页,每页有10条记录 select top 10 * from (select row_number() over(order by sno asc) as rownumber,* from student) temp_row where rownumber>10;
ログイン後にコピー

クエリ結果と時間

SQLサーバーのページングメソッドとは何ですか?

SQLサーバーのページングメソッドとは何ですか?

4 番目のメソッド: offset /fetch next (2012 バージョン以降でのみ利用可能)

コード実装

set statistics time on; -- 分页查询(通用型) select * from student order by sno offset ((@pageIndex-1)*@pageSize) rows fetch next @pageSize rows only; -- 分页查询第2页,每页有10条记录 select * from student order by sno offset 10 rows fetch next 10 rows only ;
ログイン後にコピー

offset A 行、最初の A レコードを破棄、次の B 行のみをフェッチし、B データを後方に読み取ります。

結果と実行時間

SQLサーバーのページングメソッドとは何ですか?

SQLサーバーのページングメソッドとは何ですか?

カプセル化されたストアド プロシージャ

最後に、ページングをカプセル化しました。ストアド プロシージャは誰でも呼び出すことができるため、ページングを作成するときにこのストアド プロシージャを直接呼び出すことができます。

ページング ストアド プロシージャ

create procedure paging_procedure ( @pageIndex int, -- 第几页 @pageSize int -- 每页包含的记录数 ) as begin select top (select @pageSize) * -- 这里注意一下,不能直接把变量放在这里,要用select from (select row_number() over(order by sno) as rownumber,* from student) temp_row where rownumber>(@pageIndex-1)*@pageSize; end -- 到时候直接调用就可以了,执行如下的语句进行调用分页的存储过程 exec paging_procedure @pageIndex=2,@pageSize=10;
ログイン後にコピー
概要

上記 4 つのページング メソッドの実行時間によると、上記 4 つのページング メソッドのうち、2 番目と 3 番目のページング メソッドは、 3 番目と 4 番目の方法のパフォーマンスは似ていますが、最初の方法のパフォーマンスは非常に低いため、お勧めできません。また、このブログでは少量のデータをテストしており、大量のデータのページングは行っていないため、大量のデータをページングする必要がある場合にどちらの方法のパフォーマンスが優れているかは明らかではありません。ここでは 4 番目の方法をお勧めしますが、結局のところ、4 番目の方法は SQL Server 会社がアップグレードした後に導入された新しい方法なので、理論的にはパフォーマンスと可読性が向上するはずです。

関連する推奨事項: 「

mysql チュートリアル

以上がSQLサーバーのページングメソッドとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!