0Pricing
SQL Academy · レッスン

LIMIT、OFFSETとページネーションの基礎

LIMITとOFFSETで大きな結果セットをページ分割し、性能上のトレードオフを理解して、安定したスクロールにキ​​ーセットページネーションを使います。

「LIMIT、OFFSETとページネーションの基礎」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

LIMIT:結果件数を制限する

LIMIT nは最大でn行を返します。

SELECT * FROM products
ORDER BY created_at DESC
LIMIT 10;

OFFSET:先頭のN行をスキップする

OFFSET kは先頭からk行をスキップします。

-- Rows 11–20 (the second page of 10):
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;

ページネーション=LIMIT + OFFSET

一般的なページ番号方式は次のとおりです。

-- Page p (1-based), page size s:
SELECT * FROM articles
ORDER BY published_at DESC
LIMIT s OFFSET (p - 1) * s;

OFFSETが遅くなる理由

OFFSETでは、スキップするすべての行を内部で読み取ります。

  • 10行の1ページ目 → 10行を読み取る
  • 10行ずつの1000ページ目 → 10,000行を読み取る
  • 1,000,000ページ目 → 1,000万行を読み取る

OFFSETの計算量はO(offset)です。深いページでは実用になりません。

キーセットページネーション(「シーク方式」)

最後に確認したソートキーを記録し、その位置から次のページを取得します。

-- First page:
SELECT * FROM articles
ORDER BY published_at DESC, id DESC
LIMIT 20;

-- Next page — pass the last seen (published_at, id):
SELECT * FROM articles
WHERE (published_at, id) < ($1, $2)
ORDER BY published_at DESC, id DESC
LIMIT 20;

キーセットが高速な理由

キーセットページネーションでは、インデックス範囲スキャンを使用します。最後に確認した行の直後まで直接移動し、N行を読み取れば完了します。コストはページの深さに関係なく、O(ページサイズ)です。

ORDER BYなしのLIMITは非決定的

経験則として、LIMITには必ずORDER BYを組み合わせてください。そうしないと、データベースは呼び出しごとに異なる行を返す可能性があります。

-- Wrong — results may vary between runs:
SELECT * FROM events LIMIT 10;

-- Right:
SELECT * FROM events ORDER BY id DESC LIMIT 10;

総件数とページネーション

UIでは、合計行数が必要になることがあります。別途COUNT(*)クエリを実行するのが最も簡単ですが、大きなテーブルではコストが高くなる可能性があります。

SELECT COUNT(*) FROM articles WHERE author_id = $1;

-- Alternative for huge tables: estimate from pg_class.reltuples or use approximate counts.

FETCH FIRST(標準SQL)

LIMITに相当する標準SQLの構文です。

SELECT * FROM products
ORDER BY id
FETCH FIRST 10 ROWS ONLY;

-- With offset:
-- OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY

巨大な結果セットのためのカーソル

数百万行をエクスポートする場合は、LIMIT/OFFSETのループではなく、DBカーソルまたはストリーミング対応のドライバーを使用してください。

BEGIN;
DECLARE big_cursor CURSOR FOR
  SELECT * FROM events ORDER BY id;
FETCH 1000 FROM big_cursor;
-- ...
CLOSE big_cursor;
COMMIT;

OFFSETを使ってもよい場合

浅いページ(UIの1~10ページ目)や小さなテーブルではOFFSETを使っても問題ありません。深いページネーション、無限スクロール、APIではキーセットページネーションを使用してください。

まとめ

LIMITとOFFSETで結果セットをページネーションできます。

  • 必ずORDER BYと組み合わせる
  • 深いページではOFFSETが遅くなるため、大きなページではキーセットに切り替える
  • FETCH FIRSTは標準SQLでの同等の構文

クイックチェック

大きなテーブルの深い位置までページネーションする場合、最も効率的な方法はどれですか。

よくある質問

「LIMIT、OFFSETとページネーションの基礎」レッスンは無料ですか?

はい。「LIMIT、OFFSETとページネーションの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「LIMIT、OFFSETとページネーションの基礎」で何を学びますか?

LIMITとOFFSETで大きな結果セットをページ分割し、性能上のトレードオフを理解して、安定したスクロールにキ​​ーセットページネーションを使います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「LIMIT、OFFSETとページネーションの基礎」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 列と式の選択
  2. WHEREフィルター:比較演算子と論理演算子
  3. 単一列・複数列のORDER BY
  4. LIMIT、OFFSETとページネーションの基礎
← SQL Academyに戻る