すべてのプロダクト
Search
ドキュメントセンター

Lindorm:カーソルページネーション (パブリックプレビュー)

最終更新日:Apr 09, 2025

従来のページネーションがビジネス要件を満たせない場合は、クエリでカーソルページネーションを実装できます。 このメソッドはページカーソルを記録して、大規模なデータセットから目的のデータを効率的にクエリし、広範なスキャン操作によって発生するパフォーマンスオーバーヘッドを最小限に抑えます。 このトピックでは、カーソルページネーション機能の使用方法と関連する注意事項について説明します。

前提条件

LindormTable のバージョンが 2.7.8 以降であること。 LindormTable のバージョンを表示し、コンソールでマイナーバージョンを 2.7.8 以降に更新できます。

注意事項

  • カーソルページネーションは単純なクエリのみをサポートし、SUM や COUNT などの集計関数、ORDER BY 句、または GROUP BY 句を含むクエリは処理できません。

  • カーソルページネーションは、OFFSET 句および LIMIT 句と組み合わせて使用する必要があります。

概要

従来のページネーションは、OFFSET 句と LIMIT 句を使用してメモリ内のデータをフィルタリングします。 大量のデータを処理する場合、大量のデータがスキャンされてスキップされるため、ディープページネーションは非効率的です。

Lindorm はカーソルページネーション機能を提供します。 この機能を使用すると、クエリ文で OFFSET 句と LIMIT 句を使用してページネーションロジックを実装できます。 クエリでカーソルページネーションを使用すると、システムはカーソルに基づいてデータの位置を特定します。 これにより、広範なデータのスキャン操作とスキップ操作が回避され、大量のデータを処理する必要がある場合のクエリの効率が大幅に向上します。

クエリでカーソルページネーションを使用する

明示的なプロジェクション (推奨)

クエリ文で _l_next_cursor_ ヒントを使用して、次のページのカーソルを返します。 サンプルコード:

SELECT <column_identifier1>, <column_identifier2>, _l_next_cursor_ FROM <table_identifier> LIMIT 0, 5;

クエリでカーソルページネーションを使用すると、_l_next_cursor_ カラムが返され、次のページのカーソルを示す VARCHAR 値が含まれます。

次のページのデータをクエリするには、WHERE 句で _l_current_cursor_ ヒントを使用できます。 _l_current_cursor_ ヒントでは、AND ロジックを使用して、c1=1 などのカーソル値と元のフィルター条件を指定する必要があります。 サンプルコード:

SELECT <column_identifier 1>, <column_identifier 2>, _l_next_cursor_ FROM <table_identifier> WHERE _l_current_cursor_ = '<Cursor value>' AND <Filter condition> 1 LIMIT 5, 5;

暗黙的なプロジェクション

説明

クエリ対象の列を特定できない場合は、暗黙的なプロジェクションを使用することをお勧めします。 たとえば、動的カラムをクエリする必要があります。

投影される列のリストがアスタリスク (*) で指定されている場合、システムはテーブル内の事前定義列のみを返します。 カーソル列は結果に含まれません。 次のページのカーソルを返すには、SELECT キーワードの後に /*+ l_allow_cursor */ ヒントを追加します。 サンプルコード:

SELECT /*+ _l_allow_cursor_ */ * FROM <table_identifier> LIMIT 0, 5;

クエリでカーソルページネーションを使用すると、_l_next_cursor_ カラムが返され、次のページのカーソルを示す VARCHAR 値が含まれます。 次のページのデータをクエリするには、WHERE 句で _l_current_cursor_ ヒントを使用できます。 _l_current_cursor_ ヒントでは、AND ロジックを使用して、c1=1 などのカーソル値と元のフィルター条件を指定する必要があります。 サンプルコード:

SELECT /*+ _l_allow_cursor_ */ * FROM <table_identifier> WHERE _l_current_cursor_ = '<Cursor value>' AND <Original filter condition> LIMIT 5,5;
重要

_l_next_cursor_ 列には異なるカーソル値が返されます。 次のページのカーソルとして最後のカーソル値を使用する必要があります。

tb_cursor_test という名前のサンプルテーブルを作成するには、次の文を実行します。

-- サンプルテーブルを作成します。
CREATE TABLE tb_cursor_test(c1 INT , c2 INT, c3 VARCHAR(50), PRIMARY KEY(c1));

-- テーブルにデータを挿入します。
UPSERT INTO tb_cursor_test(c1, c3) VALUES (1, 'c3_1'),(2, 'c3_2'),(3, 'c3_3'),(4, 'c3_4'),(5, 'c3_5');
UPSERT INTO tb_cursor_test(c1, c3) VALUES (6, 'c3_6'),(7, 'c3_7'),(8, 'c3_8'),(9, 'c3_9'),(10, 'c3_10');
UPSERT INTO tb_cursor_test(c1, c3) VALUES (11, 'c3_11'),(12, 'c3_12'),(13, 'c3_13'),(14, 'c3_14'),(15, 'c3_15');
  1. カーソルページネーションを使用して最初のページのデータをクエリします。

    重要

    カーソルページネーションを使用して最初のページのデータをクエリする場合は、クエリ文で _l_next_cursor_ ヒントを使用する必要があります。

    SELECT c1, c2, c3,  _l_next_cursor_ FROM tb_cursor_test LIMIT 0, 5;

    出力例:

    +----+------+------+------------------------------+
    | c1 | c2   | c3   | _l_next_cursor_              |
    +----+------+------+------------------------------+
    | 1  | null | c3_1 | AAAABIAAAAYFAAAABk5PUk1BTA== |
    | 2  | null | c3_2 | AAAABIAAAAYFAAAABk5PUk1BTA== |
    | 3  | null | c3_3 | AAAABIAAAAYFAAAABk5PUk1BTA== |
    | 4  | null | c3_4 | AAAABIAAAAYFAAAABk5PUk1BTA== |
    | 5  | null | c3_5 | AAAABIAAAAYFAAAABk5PUk1BTA== |
    +----+------+------+------------------------------+

    クエリ結果の _l_next_cursor_ 列の AAAABIAAAAYFAAAABk5PUk1BTA== は、次のページのカーソルを示します。

  2. 2 番目のページのデータをクエリするには、WHERE 句でカーソル値を指定します。 カーソル値は、最初のページのクエリ結果で返されます。 サンプルコード:

    SELECT c1, c2, c3,  _l_next_cursor_ FROM tb_cursor_test WHERE  _l_current_cursor_ = 'AAAABIAAAAYFAAAABk5PUk1BTA==' LIMIT 5, 5;

    出力例:

    +----+------+-------+------------------------------+
    | c1 | c2   | c3    | _l_next_cursor_              |
    +----+------+-------+------------------------------+
    | 6  | null | c3_6  | AAAABIAAAAsKAAAABk5PUk1BTA== |
    | 7  | null | c3_7  | AAAABIAAAAsKAAAABk5PUk1BTA== |
    | 8  | null | c3_8  | AAAABIAAAAsKAAAABk5PUk1BTA== |
    | 9  | null | c3_9  | AAAABIAAAAsKAAAABk5PUk1BTA== |
    | 10 | null | c3_10 | AAAABIAAAAsKAAAABk5PUk1BTA== |
    +----+------+-------+------------------------------+
  3. 3 番目のページのデータをクエリします。 サンプルコード:

    SELECT c1, c2, c3,  _l_next_cursor_ FROM tb_cursor_test WHERE  _l_current_cursor_ = 'AAAABIAAAAsKAAAABk5PUk1BTA==' LIMIT 10, 5;

    出力例:

    +----+------+-------+-----------------+
    | c1 | c2   | c3    | _l_next_cursor_ |
    +----+------+-------+-----------------+
    | 11 | null | c3_11 | null            |
    | 12 | null | c3_12 | null            |
    | 13 | null | c3_13 | null            |
    | 14 | null | c3_14 | null            |
    | 15 | null | c3_15 | null            |
    +----+------+-------+-----------------+

    3 番目のページが最後のページであるため、結果にはカーソル値は返されません。