4 lecture des minutes
Technologies composables : la clé pour personnaliser l'expérience omnicanale
Personnalisez l'expérience client et boostez la fidélisation avec des technologies composables pour une stratégie omnicanale efficace.
Recevez les dernières informations, recherches et actualités directement dans votre boîte aux lettres électronique.
De plus, participez au tirage au sort de la 2e édition d'Omnichannel Retail par Tim Mason et Sarah Jarvis!
Pas de spam. Nous le promettons. 💜
AIR
Acquire. Interact. Retain.
Redonnez vie à vos relations avec vos clients
Étude de cas :
Découvrez comment Eagle Eye a aidé Giant Eagle à relancer myPerks, en diffusant plus de 25 millions d'offres personnalisées chaque mois et en améliorant le ROI (retour sur investissement) du programme de fidélité.
3 lecture des minutes
Basile Perraud
:
Updated on juillet 29, 2026
Lors du développement d'une interface web, il est courant d'avoir à gérer de grands volumes de données. L'une des méthodes permettant d'optimiser la récupération des données consiste à utiliser la pagination, c'est-à-dire à charger les enregistrements de manière incrémentielle, par exemple à mesure que l'utilisateur fait défiler la page vers le bas. À chaque requête, un nombre fixe d'éléments est récupéré (limit), à partir d'une position spécifique dans la liste (offset).
non définiSELECT
*
FROM
<table>
OFFSET
<Y>
LIMIT
<X>;
La solution la plus simple, et la plus couramment utilisée, consiste à ajouter des clauses LIMIT et OFFSET à vos requêtes SQL. Cependant, cette approche devient rapidement problématique à mesure que les volumes de données augmentent. Dans cet article, je vais vous expliquer pourquoi cette méthode n’est pas optimale sous PostgreSQL, et comment la remplacer par une stratégie de pagination plus efficace basée sur les index.
LIMIT OFFSETUtiliser LIMIT 10 OFFSET 1000 pour récupérer la page 101 peut sembler anodin, mais PostgreSQL effectue en coulisses bien plus d’opérations que vous ne le pensez :
Au lieu d’utiliser un décalage arbitraire, nous pouvons paginer à l’aide d’une valeur connue issue d’un index, généralement un identifiant incrémenté automatiquement ou un horodatage (created_at). C’est ce qu’on appelle communément la pagination par jeu de clés.
Exemple
Pagination basée sur l'OFFSET (non recommandée)
non définiSELECT
*
FROM
users
WHERE
id > 12345
ORDER BY
id
LIMIT
10;
Pagination par ensemble de clés (recommandée)
désactivéSELECT
*
FROM
users
WHERE
id > 12345
ORDER BY
id
LIMIT
10;
L'idée est d'utiliser la dernière valeur de la page précédente (par exemple, id = 12345) pour charger la suivante. Cette requête :
Tests de performance
Pour être plus concret, prenons l'exemple d'une table contenant environ 2 millions de lignes. Nous allons essayer de récupérer les lignes comprises entre 1 000 000 et 1 000 010.
Requête basée sur OFFSET (non recommandée)
non définiSELECT
*
FROM
"client_data"."ean"
ORDER BY
id
OFFSET
1000000
LIMIT
10;
Analyse du plan d'exécution :

Le plan d'exécution indique un balayage d'index sur ean_pkey, mais sans aucune condition de filtrage. PostgreSQL lit l'intégralité de la table, trie toutes les lignes, ignore les 1 000 000 premières et renvoie les 10 lignes suivantes.
➡️ Cela entraîne un coût total très élevé (~548k) et rend la navigation en profondeur extrêmement inefficace.
Requête basée sur un ensemble de clés (recommandée)
sans ensemble declés SELECT
*
FROM
"client_data"."ean"
WHERE
id > '2609901045790'
ORDER BY
id
LIMIT 10;
Analyse du plan d'exécution :

Grâce à la condition id > ..., PostgreSQL déclenche un balayage d'index sur ean_pkey. L'exécution commence immédiatement après la clé spécifiée et ne lit que les 10 lignes pertinentes. Le plan affiche un coût minimal (0,56 à 7,40), ce qui indique une utilisation efficace de l’index. Il n’est pas nécessaire de parcourir l’intégralité de l’index, ce qui rend la requête très performante et stable, même à grande échelle.
Cette méthode présente quelques contraintes :
Cependant, dans la plupart des cas, ces compromis sont mineurs par rapport aux gains en termes de performances et de fiabilité.
Pour illustrer un cas d'utilisation concret, voici comment nous avons mis en œuvre la pagination par ensemble de clés chez EagleAI, en utilisant Python FastAPI pour le backend et Next.js pour le frontend.
Le backend renvoie :
Pour changer de page, l'interface utilisateur renvoie l'ID de référence (last_seen_id) (soit le premier, soit le dernier élément de la liste, selon la direction) au backend, accompagné de la direction (« next » ou « prev »). Voici la logique du backend :
Python
def get_page( db_session: Session, limit: int, last_seen_id: str | None = None, direction: Literal["next", "prev"] = "next", ): """Récupérer une page de produits.""" is_next = direction == "next" order = order_by.asc() si is_next sinon order_by.desc() query = select(Product) si last_seen_id : comparator = Product.id > last_seen_id si is_next sinon
Product.id < last_seen_id
query = query.where(comparator)
query = query.order_by(order).limit(limit)
products = db_session.execute(query).scalars().all()
return products if is_next else list(reversed(products))
Si votre base de données contient plus de quelques milliers de lignes, ou si vous souhaitez offrir une expérience utilisateur rapide et fluide, il est temps d’abandonner LIMIT OFFSET.
Passer à la pagination basée sur les index est simple, et c’est un changement qui s’avère payant à long terme.
Recevez nos dernières actualités, études et analyses directement dans votre boîte mail.
Et tentez de gagner la 2e édition de Omnichannel Retail de Tim Mason et Sarah Jarvis !
Aucun spam. Promis. 💜
4 lecture des minutes
Personnalisez l'expérience client et boostez la fidélisation avec des technologies composables pour une stratégie omnicanale efficace.
1 lecture des minutes
Découvrez le connecteur Twilio Segment Eagle Eye AIR pour activer la personnalisation et la fidélisation en temps réel à partir des données client.
6 lecture des minutes
Découvrez comment sélectionner et intégrer des solutions technologiques pour créer une stack MarTech cohérente et qui résiste à l’épreuve du temps.