全部产品
Search
文档中心

Lindorm:Paginasi kursor (dalam pratinjau publik)

更新时间:Jul 02, 2025

Jika paginasi konvensional tidak memenuhi kebutuhan bisnis Anda, Anda dapat menerapkan paginasi kursor dalam kueri. Metode ini mencatat posisi halaman menggunakan kursor untuk menanyakan data secara efisien dari dataset besar, serta meminimalkan overhead performa akibat pemindaian ekstensif. Topik ini menjelaskan cara menggunakan fitur paginasi kursor dan tindakan pencegahannya.

Prasyarat

Versi LindormTable harus 2.7.8 atau lebih baru. Anda dapat memeriksa versi LindormTable dan memperbarui versi minor ke 2.7.8 atau lebih baru melalui konsol.

Tindakan pencegahan

  • Paginasi kursor hanya mendukung kueri sederhana dan tidak dapat menangani kueri yang berisi fungsi agregat seperti SUM dan COUNT, klausa ORDER BY, atau klausa GROUP BY.

  • Paginasi kursor harus digunakan bersama dengan klausa OFFSET dan LIMIT.

Ikhtisar

Paginasi konvensional menggunakan klausa OFFSET dan LIMIT untuk menyaring data di memori. Saat menangani dataset besar, pendekatan ini menjadi tidak efisien karena sejumlah besar data dipindai dan dilewati.

Lindorm menyediakan fitur paginasi kursor. Fitur ini memungkinkan penggunaan klausa OFFSET dan LIMIT dalam pernyataan kueri untuk mengimplementasikan logika paginasi. Dengan paginasi kursor, sistem menemukan posisi data berdasarkan kursor, sehingga menghindari operasi pemindaian dan pengabaian data yang luas, serta meningkatkan efisiensi kueri saat menangani dataset besar.

Gunakan paginasi kursor dalam kueri

Proyeksi eksplisit (direkomendasikan)

Gunakan petunjuk _l_next_cursor_ dalam pernyataan kueri untuk mengembalikan kursor halaman berikutnya. Contoh kode:

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

Saat menggunakan paginasi kursor dalam kueri, kolom _l_next_cursor_ akan dikembalikan, berisi nilai VARCHAR yang menunjukkan kursor halaman berikutnya.

Untuk mengakses data pada halaman berikutnya, gunakan petunjuk _l_current_cursor_ dalam klausa WHERE. Dalam petunjuk _l_current_cursor_, terapkan logika AND untuk menentukan nilai kursor dan kondisi filter asli, seperti c1=1. Berikut adalah contoh kode:

SELECT <column_identifier 1>, <column_identifier 2>, _l_next_cursor_ FROM <table_identifier> WHERE _l_current_cursor_ = '<Nilai kursor>' AND <Kondisi filter> 1 LIMIT 5, 5;

Proyeksi implisit

Catatan

Jika Anda tidak dapat menentukan kolom yang akan ditanyakan, disarankan untuk menggunakan proyeksi implisit, misalnya saat menanyakan kolom dinamis.

Jika daftar kolom proyeksi ditentukan menggunakan asterisk (*), sistem hanya mengembalikan kolom yang telah ditentukan sebelumnya dalam tabel. Kolom kursor tidak termasuk dalam hasil. Untuk mengembalikan kursor halaman berikutnya, tambahkan petunjuk /*+ l_allow_cursor */ setelah kata kunci SELECT. Contoh kode:

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

Saat menggunakan paginasi kursor dalam kueri, kolom _l_next_cursor_ akan dikembalikan, berisi nilai VARCHAR yang menunjukkan kursor halaman berikutnya. Untuk menanyakan data pada halaman berikutnya, gunakan petunjuk _l_current_cursor_ dalam klausa WHERE. Dalam petunjuk _l_current_cursor_, gunakan logika AND untuk menentukan nilai kursor dan kondisi filter asli, seperti c1=1. Contoh kode:

SELECT /*+ _l_allow_cursor_ */ * FROM <table_identifier> WHERE _l_current_cursor_ = '<Nilai kursor>' AND <Kondisi filter asli> LIMIT 5,5;
Penting

Nilai kursor yang berbeda dikembalikan dalam kolom _l_next_cursor_. Gunakan nilai kursor terakhir sebagai kursor halaman berikutnya.

Contoh

Jalankan pernyataan berikut untuk membuat tabel sampel bernama tb_cursor_test:

-- Buat tabel sampel.
CREATE TABLE tb_cursor_test(c1 INT , c2 INT, c3 VARCHAR(50), PRIMARY KEY(c1));

-- Masukkan data ke dalam tabel.
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. Gunakan paginasi kursor untuk menanyakan data di halaman pertama.

    Penting

    Saat menggunakan paginasi kursor untuk menanyakan data di halaman pertama, pastikan untuk menggunakan petunjuk _l_next_cursor_ dalam pernyataan kueri.

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

    Contoh keluaran:

    +----+------+------+------------------------------+
    | 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== |
    +----+------+------+------------------------------+

    Dalam hasil kueri, nilai AAAABIAAAAYFAAAABk5PUk1BTA== dalam kolom _l_next_cursor_ menunjukkan kursor halaman berikutnya.

  2. Untuk menanyakan data di halaman kedua, tentukan nilai kursor dalam klausa WHERE. Nilai kursor didapatkan dari hasil kueri halaman pertama. Contoh kode:

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

    Contoh keluaran:

    +----+------+-------+------------------------------+
    | 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. Tanyakan data di halaman ketiga. Contoh kode:

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

    Contoh keluaran:

    +----+------+-------+-----------------+
    | 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            |
    +----+------+-------+-----------------+

    Tidak ada nilai kursor yang dikembalikan dalam hasil karena halaman ketiga adalah halaman terakhir.