ホームページ  >  記事  >  データベース  >  SQLサーバーのページングメソッドとは何ですか?

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

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-08-06 09:22:003859ブラウズ

この記事では、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 までご連絡ください。