DOracle à PostgreSQL...
Plus quau niveau du SGBDR cest au niveau des développements applicatifs que les optimisations sont les plus spectaculaires. Ici mon travail consistait à migrer un batch de chargement dune base de connaissance. Les tickets des 5 dernières années provenant des appels effectués au support sont quotidiennement chargés, organisés et indexés de manière à pouvoir effectuer des recherches sur le nom du produit, le client, la date etc. mais aussi de la recherche full text. Sont ainsi indexés le titre du ticket, la description du problème par le client, la solution qui lui avait été proposée ainsi que le suivi interne des échanges entre les différents niveaux de support. Il existe des moteurs dindexation full text dédiés type Apache Lucene etc. mais pour traiter quelques dizaines de Go les capacité natives de PostgreSQL, Oracle ou SQL Server sont amplement suffisantes.
A lorigine Oracle Database XE était utilisé mais cette version gratuite dOracle Database ne permet de stocker que 11Go de données. Cette limite était atteinte alors même que les contenus longs étaient tronqués pour ne pas dépasser la limitation à 4000 octets du type VARCHAR2 en 11gR2. Le chargement prenait 1h30 et des essais avec Oracle Enterprise Edition donnaient le même temps. Individuellement chaque requête ne pouvait pas être optimisée. Les contraintes fixées étaient de faire travailler le moins possible la production transactionnelle tournant alors sous SQL Server 2000. Il fallait également charger lintégralité des données à chaque fois de manière à simplifier la gestion. Les données de la base de connaissance ne devaient en effet pas nécessiter de sauvegardes. En cas de problème le serveur serait restauré avec une base vide et le traitement habituel serait relancé pour la réinitialiser.
Bref il ne fallait pas changer grand chose et pourtant après la migration vers PostgreSQL les temps dinterrogation de la base ont été meilleurs, notamment car Oracle XE ne peut utiliser quun CPU même sur une machine multiprocesseurs. Mais surtout le chargement a pu être bouclé en 20 minutes tout en récupérant lintégralité des contenus dans des colonnes PostgreSQL de type TEXT, un VARCHAR sans limitation de taille. Alors PostgreSQL supérieur à Oracle Database ? Cest ce que jaurais pu affirmer mais non ce nest pas ça qui a permis de gagner 1h10.
Un coureur de semi-marathon court plus longtemps quun coureur de 5000m !
Zoomons sur la partie mise à jour de cette table telle quelle aurait été réalisée avec PostgreSQL en adaptant simplement le traitement requête par requête :
Quel est le problème de cette approche ? Elle oblige à balayer N fois la table TABLE_RECHERCHE alors que tout peut être fait dès sa création avec une requête de ce style :
Les optimiseurs dOracle, de PostgreSQL ou de SQL Server travaillent requête par requête. Ils choisissent pour chaque requête le meilleur plan dexécution en fonction des statistiques dont ils disposent. Ils peuvent éventuellement paralléliser lexécution dune requéte donnée si vous utilisez PostgreSQL-XL, PostgreSQL à partir de la version 9.6, Oracle Enterprise Edition ou SQL Server.
Cependant ils ne prendront jamais une initiative consistant à regrouper certaines opérations, à paralléliser certaines parties du traitement etc. Ils ne font en effet "que" ce que nous leur demandons et heureusement ! En aucun cas lutilisation de tel ou tel SGBDR ne vous dispensera de réfléchir. Ici je nai même pas optimisé le chargement, sa durée pourrait encore être largement réduite mais elle a été jugée convenable et je ne suis pas allé plus loin.