ページング

★ページングの設計

1.クライアント側でのページング

メリット:通信回数を減らす

デメリット:初回のデータ表示が遅い、クライアント側のメモリが消費大

利用場面:通信遅延が深刻

2.サーバ側でのページング

メリット:データアクセス処理の回数を減らす

デメリット:データ量が多い場合に不適

利用場面:RDBMSがページングに支持しない、データ量が少ない

List list = (List) stmt.executeQuery("SELECT * FROM test ORDER BY id");

int count= list.size();

List subList= list.subList(10, 20);

3.DB側でのページング

メリット:性能が良い

デメリット:RDBMSごとに対応が必要、二回SQL発行(総件数の合計+ページング計算)

M番目からN行を取得

SQL Server

★IDが連続である

SELECT * FROM table WHERE ID BETWEEN M AND (M + N - 1)

★IDが連続ではない

--書き方1

SELETE TOP N *

FROM (SELECT TOP (M + N -1) * FROM table ORDER BY id) t

ORDER BY t.ID DESC

--書き方2 推薦

SELECT *

FROM (SELECT ROW_NUMBER() OVER(ORDER BY id) AS 'seq', table.* FROM table ) t

WHERE t.seq BETWEEN M AND (M + N - 1)

--書き方3 SQL Server 2012

SELECT *

FROM table ORDER BY id

OFFSET M ROWS FETCH NEXT N ROWS ONLY

SELECT DISTINCT TOP 10 *

FROM i

ORDER BY ..

-- 相当

SELECT *

FROM i

ORDER BY ..

OFFSET 0 ROWS

FETCH NEXT 10 ROWS ONLY

Oracle

SELECT *

FROM (SELECT ROWNUM r, t1.* FROM table t1 WHERE ROWNUM <= M + N) t2

WHERE t2.r >= M

MySQL

SELECT * FROM table LIMIT M, N

★N行取得

SQL Server

SELECT TOP N id, first_name, last_name FROM person

Oracle

SELECT id, first_name, last_name FROM person WHERE ROWNUM <= N

※ROWNUM > N或いはROWNUM >= N(1除外)はNG

WHERE ROWNUM = 1 1行のみを取得

DB2

SELECT id, first_name, last_name FROM person FETCH FIRST N ROWS ONLY

MySql

SELECT id, first_name, last_name FROM person LIMIT N

PostgreSQL

SELECT id, first_name, last_name FROM person LIMIT N