OFFSET/LIMIT La pagination classique analyse et ignore toutes les lignes précédant la page demandée, ce qui entraîne une augmentation linéaire du temps de requête avec la profondeur de la page. La pagination par curseur évite cet écueil en enregistrant la position de la dernière ligne renvoyée et en démarrant la requête suivante directement à partir de cette position. Utilisez la pagination par curseur lorsque la pagination conventionnelle OFFSET/LIMIT s'avère trop lente pour la taille de votre jeu de données.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
LindormTable version 2.7.8 ou ultérieure. Pour vérifier la version et mettre à niveau, consultez les Notes de version de LindormTable et la rubrique Mise à niveau de la version mineure du moteur
Limites
La pagination par curseur prend uniquement en charge les requêtes simples. Les requêtes contenant des fonctions d'agrégation (
SUM,COUNT), des clausesORDER BYou des clausesGROUP BYne sont pas prises en charge.La pagination par curseur requiert les clauses
OFFSETetLIMIT.
Parcourir les résultats
La boucle de pagination suit les quatre étapes suivantes pour chaque requête :
Exécutez la requête de la première page en incluant
_l_next_cursor_dans la listeSELECT(ou utilisez l'indicateur/*+ _l_allow_cursor_ */pour les requêtes avec caractères génériques).À partir de l'ensemble de résultats, récupérez la dernière valeur
_l_next_cursor_; il s'agit du curseur pour la page suivante.Transmettez ce curseur dans la clause
WHEREsous la forme_l_current_cursor_ = '<cursor value>'dans les requêtes suivantes.Arrêtez le processus lorsque
_l_next_cursor_renvoienull: vous avez atteint la dernière page.
Sélectionnez le style de projection adapté à votre requête :
| Style | Cas d'utilisation |
|---|---|
| Projection explicite (recommandée) | Vous connaissez les colonnes à renvoyer |
| Projection implicite | Vous avez besoin de toutes les colonnes, y compris les dynamiques (SELECT *) |
Projection explicite (recommandée)
Incluez _l_next_cursor_ directement dans la liste des colonnes.
Première page :
SELECT <column_identifier1>, <column_identifier2>, _l_next_cursor_ FROM <table_identifier> LIMIT 0, 5;
Le résultat comprend une colonne _l_next_cursor_ contenant une valeur de curseur VARCHAR pour chaque ligne.
Chaque ligne du résultat possède une valeur _l_next_cursor_. Utilisez la valeur de la dernière ligne comme curseur pour la page suivante.
Pages suivantes :
SELECT <column_identifier1>, <column_identifier2>, _l_next_cursor_ FROM <table_identifier> WHERE _l_current_cursor_ = '<cursor value>' AND <filter condition> LIMIT 5, 5;
Dans la clause WHERE, combinez la condition de curseur et toute condition de filtre d'origine à l'aide de AND.
Projection implicite
Lorsque la liste des colonnes est *, LindormTable renvoie uniquement les colonnes prédéfinies et exclut le curseur. Pour inclure le curseur dans une requête avec caractères génériques, ajoutez l'indicateur /*+ _l_allow_cursor_ */ après SELECT.
Première page :
SELECT /*+ _l_allow_cursor_ */ * FROM <table_identifier> LIMIT 0, 5;
Pages suivantes :
SELECT /*+ _l_allow_cursor_ */ * FROM <table_identifier> WHERE _l_current_cursor_ = '<cursor value>' AND <original filter condition> LIMIT 5, 5;
Utilisez la projection implicite lorsque vous ne pouvez pas déterminer les colonnes à l'avance, par exemple lors de l'interrogation de colonnes dynamiques.
Exemples
Les exemples suivants utilisent une table d'exemple contenant 15 lignes pour illustrer la récupération de trois pages de cinq lignes chacune.
Configuration de la table d'exemple :
-- Create a sample table.
CREATE TABLE tb_cursor_test(c1 INT , c2 INT, c3 VARCHAR(50), PRIMARY KEY(c1));
-- Insert data into the table.
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');
Étape 1 : Récupérer la page 1
La requête de la première page doit inclure _l_next_cursor_ dans la liste SELECT pour initialiser la pagination par curseur.
SELECT c1, c2, c3, _l_next_cursor_ FROM tb_cursor_test LIMIT 0, 5;
Sortie :
+----+------+------+------------------------------+
| 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== |
+----+------+------+------------------------------+
La valeur _l_next_cursor_ de la dernière ligne est AAAABIAAAAYFAAAABk5PUk1BTA==. Utilisez cette valeur pour récupérer la page 2.
Étape 2 : Récupérer la page 2
SELECT c1, c2, c3, _l_next_cursor_ FROM tb_cursor_test WHERE _l_current_cursor_ = 'AAAABIAAAAYFAAAABk5PUk1BTA==' LIMIT 5, 5;
Sortie :
+----+------+-------+------------------------------+
| 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== |
+----+------+-------+------------------------------+
Le curseur suivant est AAAABIAAAAsKAAAABk5PUk1BTA==. Utilisez-le pour récupérer la page 3.
Étape 3 : Récupérer la page 3
SELECT c1, c2, c3, _l_next_cursor_ FROM tb_cursor_test WHERE _l_current_cursor_ = 'AAAABIAAAAsKAAAABk5PUk1BTA==' LIMIT 10, 5;
Sortie :
+----+------+-------+-----------------+
| 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 |
+----+------+-------+-----------------+
_l_next_cursor_ vaut null : il s'agit de la dernière page. Arrêtez la pagination ici.