Makina Blog

Le blog Makina-corpus

Les curseurs PostgreSQL


Découvrons comment utiliser les curseurs PostgreSQL pour effectuer des requêtes renvoyant de nombreux enregistrements

Pour effectuer des traitements par lots on a parfois besoin d'effectuer des requêtes SQL qui renvoient un grand nombre d'enregistrements. Malheureusement dans ces cas là, si on effectue une requête classique, l'utilisation de la mémoire par le programme appelant peut devenir trop importante. Voici à quoi pourrait ressembler un code de ce type en Python :

cursor = connection.cursor()
cursor.execute("SELECT * FROM table")
for record in cursor:
    do_something_with(record)

Appliqué à une table contenant quelques dizaines de milliers d'enregistrements, ce code a une consommation mémoire très importante :

PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+   COMMAND
1630 alex      20   0 3328m 2.9g  11m S 38.1 37.6    0:10.61 python

L'explication nous en est donnée dans la doc de psycopg2 :

Lorsque une requête de base de données est exécutée, le `cursor` Psycopg récupère habituellement tous les enregistrements renvoyés par le serveur et les transfère au processus client. Si la requête renvoie une énorme quantité de données, une quantité de mémoire de taille proportionnelle est allouée par le client.

Au lieu de charger toutes les données en mémoire d'un seul coup, il serait préférable de les consommer au fur et à mesure, sous forme de flux. C'est la raison d'être des curseurs PostgreSQL :

pgsql=# BEGIN;
BEGIN
pgsql=# DECLARE mon_curseur CURSOR FOR SELECT uid FROM ma_table;
DECLARE CURSOR
pgsql=# FETCH 10 mon_curseur;
                 uid              
----------------------------------
 000061788a874398821c8625e0fd24fb
 00007e1c94ca43f28dd50165a739d65c
 00031b13609d44db94b666b13e85baea
 0004a1f90bf94a12bd028a40b102c8f3
 0006623267e345e9af791cb8c0ec9021
 00067c3g6197413db58bc9736838515f
 0007bf39966f4d53baf149016bfdd74c
 0008a1b01aca4ab18a197d09e2f2ecae
 0008c1c8077a40759f18ea3d99d5ddbd
 00095c7cbef04a0baca9cedaa69d15fb
(10 rows)

pgsql=# END;
COMMIT

La commande DECLARE permet de déclarer un curseur en lui donnant un nom. On peut ensuite utiliser FETCH pour récupérer un nombre donné d'enregistrements.

Psycopg facilite grandement cette procédure, il suffit en effet de passer un nom de curseur en argument de la fonction cursor pour que le curseur côté serveur soit automatiquement créé. Le code Python devient donc:

cursor = connection.cursor(name="mon_curseur")
cursor.execute("SELECT * FROM table")
for record in cursor:
    do_something_with(record)

Et la consommation de mémoire redescend à un niveau raisonnable :

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
727 alex      20   0  543m 173m  11m S 44.5  2.2   0:08.14 python

Voilà comment on peut très simplement optimiser l'utilisation mémoire de nos programmes effectuant des requêtes renvoyant beaucoup de données.

Si cet article vous a intéressé, vous serez peut-être curieux de découvrir notre formation base de données PostgreSQL / PostGIS.

Formations associées

Formations Outils et bases de données

Formation PostgreSQL

Nantes Du 11 au 13 décembre 2024

Voir la formation

Formations SIG / Cartographie

Formation PostGIS

À distance (FOAD) Du 9 au 13 décembre 2024

Voir la formation

Formations Python

Formation Python

À distance (FOAD) Du 16 au 20 décembre 2024

Voir la formation

Actualités en lien

Image
Encart PyConFr 2024
21/10/2024

Makina Corpus est spon­sor de la PyConFR 2024

Le soutien de Makina Corpus à la PyConFR 2024, qui se tient du 31 octobre au 3 novembre 2024 à Stras­bourg, reflète ses valeurs de partage et d’in­no­va­tion, et son enga­­ge­­ment envers la commu­nauté dyna­­mique et ouverte de Python.

Voir l'article
Image
Webinaire découverte de Canari
10/04/2024

Revoir les webi­naires : décou­verte de l’ou­til CANARI-France

L’ap­pli­ca­tion CANARI-France est destiné aux acteurs agri­coles afin de calcu­ler des indi­ca­teurs agro-clima­tiques à partir de projec­tions clima­tiques. Décou­vrer en le replay des 4 webi­naires orga­ni­sés par Sola­gro et l’ADEME.

Voir l'article
Image
Python
26/07/2023

La formation Python éligible au CPF est enfin arrivée

Makina Corpus propose un nouvelle formation Python éligible au CPF. Grâce à cette certification, cette formation peut être entièrement financée par votre compte Compte Personnel de Formation.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus