IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

PostgreSQL 10 : un véritable support pour le partitionnement de table sera implémenté
Dans le système de gestion de base de données libre

Le , par Michael Guilloux

193PARTAGES

11  0 
Les développeurs du système de gestion de base de données relationnelle et objet (SGBDRO) libre PostgreSQL pourraient bientôt livrer un véritable support du partitionnement de tables. De manière simpliste, on peut dire que le partitionnement fait référence à la division d'une table volumineuse en plusieurs tables plus petites, appelées partitions.

Il comporte de nombreux avantages comme l’amélioration significative des performances des requêtes en particulier lorsque la plupart des lignes fortement accédées d'une table se trouvent sur une seule partition ou sur un petit nombre de partitions. Si votre table principale est correctement partitionnée, supprimer de nombreux enregistrements sera également plus facile, car cela pourra se traduire par la suppression de tables. Il pourrait en effet être beaucoup plus difficile de supprimer de nombreux enregistrements d'une grande table et ensuite lancer un VACUUM pour récupérer l'espace de stockage occupé par des lignes supprimées. Le partitionnement sur une plage de dates signifie par exemple que pour supprimer les données les plus anciennes, vous aurez simplement besoin de supprimer une ou quelques tables. Ce qui est bien plus facile. Il en est de même pour les chargements massifs de données, ils peuvent être simplement obtenus par l’ajout de partitions, sous réserve que ce besoin ait été pris en compte lors de l’implémentation du partitionnement.

PostgreSQL offre déjà un support du partitionnement de tables, mais il s’agit d'un support basique à travers l'héritage de tables. Chaque partition doit être créée comme une table enfant d'une unique table parent. La table parent est habituellement vide et elle n'existe que pour représenter l'ensemble complet des données. Lors de la conception de votre base de données PostgreSQL, l’implémentation du partitionnement consiste à :

  • créer la table « maître » ;
  • créer plusieurs tables enfants (les partitions) qui héritent chacune de la table maître ;
  • ajouter les contraintes de tables aux tables de partitions pour définir les valeurs des clés autorisées dans chacune ;
  • pour chaque partition, créer un index sur les colonnes clés, ainsi que tout autre index nécessaire ;
  • de manière optionnelle, définir un déclencheur ou une règle pour rediriger les données insérées dans la table maître vers la partition appropriée ;
  • s'assurer que le paramètre de configuration constraint_exclusion n'est pas désactivé dans postgresql.conf. S’il est désactivé, les requêtes ne seront pas optimisées.

Mais ce support du partitionnement à travers l’héritage n’est juste qu’une méthode de contournement qui se base sur le rapprochement entre le partitionnement et l’héritage. La solution offerte par PostgreSQL consiste en effet à créer une table parent qui sera vide, des tables enfants qui héritent de la table parent, des déclencheurs pour acheminer les données insérées vers les tables de partitions appropriées, activer le paramètre constraint_exclusion pour optimiser les requêtes, etc. ; alors que le partitionnement natif ne vous montrera que la table parent, et tout le reste sera en arrière-plan. C’est-à-dire que vous n’aurez qu’à déclarer comment une table doit être partitionnée, sans devoir implémenter les détails vous-mêmes. Avec Oracle par exemple, la table partitionnée est vue par le développeur comme une unique table, mais comme plusieurs par le moteur Oracle. Ainsi, selon le critère de partitionnement, Oracle n'interrogera que les partitions concernées.

Ce que les développeurs de PostgreSQL seraient en train de faire maintenant à partir de la version 10 du SGBD, c’est d’implémenter un tel support du partitionnement de tables. Dans un mail dans la liste de diffusion de PostgreSQL, ils expliquent par exemple que « les tuples insérés dans le parent sont automatiquement acheminés vers la partition concernée, de sorte que les déclencheurs d'insertion de tuple ON INSERT ne sont pas nécessaires. » Mais, il faut noter que pour le moment, certaines fonctionnalités ne sont pas supportées. Ils avertissent par exemple que « la redirection de tuple n'est pas encore prise en charge pour les partitions qui sont des tables étrangères et ne gère pas les mises à jour qui franchissent les limites de la partition. »

S’il est similaire à l’héritage de table et réutilise une grande partie de l'infrastructure PostgreSQL existante, le partitionnement de table présente toutefois des différences importantes. Il est moins général que l'héritage de table, ce qui, selon les développeurs de PostgreSQL, rendra « plus facile de raisonner sur les propriétés des partitions et servira de base pour une variété d'optimisations possibles, y compris les optimisations du planificateur de requêtes. »

Sources : PostgreSQL Git, Partitionnement sous PostgreSQL

Et vous ?

Utilisez-vous PostgreSQL ?
Que pensez-vous du support de partitionnement de tables ?

Voir aussi :

La version finale de PostgreSQL 9.6 est disponible avec le parallélisme des requêtes et de nouvelles options pour la réplication synchrone
Les systèmes de JIT améliorent la performance des requêtes SQL complexes, une extension de PostgreSQL intègre LLVM et diminue les temps de traitement

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de cataland
Nouveau membre du Club https://www.developpez.com
Le 11/12/2016 à 13:00
ha enfin, le rêve !
ça et le sharding, même si citus par exemple commence à répondre au besoin.
0  0 
Avatar de SQLpro
Rédacteur https://www.developpez.com
Le 12/12/2016 à 9:18
Ha enfin, bonne nouvelle car la précédente mouture du partitionnement était une véritable merde innommable. J'en avais décrit les inconvénients dans cet article :
http://blog.developpez.com/sqlpro/p1...paraison_postg

Les développeurs de PG en avaient d'ailleurs conscience, car il exprimait dans les évolutions futures, le souhait de revoir leur copie !
Cela dit, ils sont sacrément en retard, car ils avaient promis la chose pour la V9 !
http://wiki.postgresql.org/wiki/Table_partitioning

Il est d'ailleurs assez amusant de constater que PG s'intéressent aux techniques de partitionnement de tous les
concurrent (même de MySQmerde) sauf à celui de SQL Server qui a été mis en place dans la version 2005 et n'a jamais évolué tant le système est stable, fiable et simplissime ! C'est très dommage...

A+
0  0