bonjour,
À travers certaines mesures expérimentales sur les bases de données dans mon boulot ; j'ai pu constater l'énorme lenteur de la commande FETCH (NEXT).
J’ai écrit un programme en ECPG dans lequel je devais poser une requête Q1 récupérer son résultat qui est un ensemble de ligne. Grâce à un curseur je parcourrai ce résultat et effectué un certain traitement sur chaque ligne que Q1 a retournée.
Ma première implémentation utilisée la commande FETCH NEXT afin de passé d'une ligne à une autre. J’ai constaté un énorme écart de temps d'exécution entre le fait de récupérer directement toutes les lignes de Q1, les stockés en mémoire dans une structure de données que le fait d'utiliser la commande Fetch Next. Cet écart est de l'ordre de 20 fois minimum et va dans des cas jusqu'à 100 fois si sennait plus!!!!
Face à une base de données importante il est clair que ça serai impossible de tout chargé dans la mémoire ; je me suis donc mis à chercher une solution sur le Web. À travers ma recherche j'ai pu constater que ce problème ne se pose pas uniquement sur postgresSQL, mais sur toutes les bases de données.
J’ai trouvé certains post qui préconisé de charger par bloc grâce à la commande FETCH FORWARD <nombre de ligne> au lieu de ligne par ligne (FETCH NEXT). En expérimentant cette approche, j'ai pu constater des améliorations non négligeables, de l'ordre de 95 % (waw).
Mais alors pourquoi je poste ce message ?
La réponse est simple : POURQUOI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Pourquoi la commande FETCH (NEXT) est aussi lente quand on lit ligne par ligne ? Cette question selon mon raisonnement nous renvoie à son implémentation ; à sa manière de marcher.
Je me tourne donc vers vous pour vous demander une explication. Et surtout savoir comment ça marche.
Merci d'avance.
PS : Tout document ou schéma expliquant le principe est le bienvenu.
Partager