{"id":8089,"date":"2019-11-22T17:23:29","date_gmt":"2019-11-22T16:23:29","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=8089"},"modified":"2019-11-22T17:27:07","modified_gmt":"2019-11-22T16:27:07","slug":"postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/","title":{"rendered":"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2)"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8089&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8089&#038;title=PostgreSQL%20%3A%20%C3%A9volution%20du%20partitionnement%20de%209.6%20%C3%A0%2012%20%282%2F2%29\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=PostgreSQL%20%3A%20%C3%A9volution%20du%20partitionnement%20de%209.6%20%C3%A0%2012%20%282%2F2%29&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8089\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>Dans <a href='https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-1-2\/' target='_blank' rel=\"noopener noreferrer\">l&#8217;article  pr\u00e9c\u00e9dent<\/a> nous avons vu les principes du partitionnement ainsi que l\u2019h\u00e9ritage. Ce second article traitera de la m\u00e9thode d\u00e9clarative ainsi que des am\u00e9liorations qui y sont li\u00e9es. <\/p>\n<h2>Partitionnement d\u00e9claratif (natif) :<\/h2>\n<p>Depuis la version 10, PostgreSQL propose le partitionnement d\u00e9claratif qui distribue automatiquement les donn\u00e9es dans la bonne partition.<br \/>\nIl n\u2019y a plus besoin de trigger, donc les performances sont meilleures.<br \/>\nLes versions majeures suivantes ont ajout\u00e9 des fonctionnalit\u00e9s comme l\u2019utilisation des Primary Key, Foreign Key, et d\u2019autres.<br \/>\nIl existe plusieurs types de cl\u00e9 de partitionnement : <\/p>\n<ul>\n<li>RANGE : La table est partitionn\u00e9e en intervalles d\u00e9finis par une colonne cl\u00e9 ou par un ensemble de colonnes, sans recouvrement entre les intervalles<\/li>\n<li>LIST : La table est partitionn\u00e9e en listant explicitement les valeurs cl\u00e9s qui apparaissent dans chaque partition<\/li>\n<li>HASH : ajout\u00e9 en 11 : Permet de r\u00e9partir les donn\u00e9es \u00e9quitablement sur les partitions sans classement particulier<\/li>\n<li>REFERENCE : non support\u00e9<\/li>\n<\/ul>\n<p>Une table partitionn\u00e9e ne peut pas contenir de donn\u00e9es, elles sont stock\u00e9es dans les partitions. <\/p>\n<p>La table partitionn\u00e9e racine est li\u00e9e \u00e0 des partitions ou des tables partitionn\u00e9es (sous partitionnement) elles-m\u00eames li\u00e9es \u00e0 des partitions.<br \/>\nUne partition est une table attach\u00e9e \u00e0 une table partitionn\u00e9e.<br \/>\nUne table partitionn\u00e9e ne peut pas devenir une table et inversement.<br \/>\nUne partition peut devenir une table et inversement.<br \/>\nDepuis la 11, les index et contraintes cr\u00e9\u00e9s sur la table partitionn\u00e9e sont r\u00e9pliqu\u00e9s sur toutes les partitions et tables partitionn\u00e9es de l\u2019arbre. <\/p>\n<p>Le partitionnement par RANGE permet d\u2019utiliser des cl\u00e9s de partitionnement multicolonnes. <\/p>\n<p>Exemple d\u2019arbre de partition :<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2-300x130.png\" alt=\"\" width=\"600\" height=\"260\" class=\"alignnone size-medium wp-image-8101\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2-300x130.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2-768x332.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2.png 810w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>La table T9 est la table partitionn\u00e9e racine.<br \/>\nLa table T9_3 est une table partitionn\u00e9e (cas de sous-partition).<br \/>\nLes autres tables sont des partitions. <\/p>\n<p>Le choix de la cl\u00e9 de partitionnement d\u00e9pend du fonctionnement de l&#8217;application.<br \/>\nAttention : un mauvais choix de partitionnement (type, choix de colonne, \u2026) est pire que de ne pas utiliser de partitionnement. Il est donc imp\u00e9ratif de faire des tests pour valider le partitionnement choisi !<br \/>\nLes mots cl\u00e9s \u201cminvalue\u201d et \u201cmaxvalue\u201d peuvent \u00eatre utilis\u00e9s pour borner les partitions de type RANGE.<br \/>\nDepuis la version 11, il est possible de cr\u00e9er une partition par d\u00e9faut, qui contiendra toutes les donn\u00e9es qui ne peuvent allez dans les autres partitions. <\/p>\n<p>Les avantages sont : <\/p>\n<ul>\n<li>Gros gain de performance<\/li>\n<li>Maintenance simplifi\u00e9e (plus de trigger, table et index plus petit, sauvegarde possiblement plus rapide)<\/li>\n<li>Les index UNIQUE (11), les cl\u00e9s primaire (11) et \u00e9trang\u00e8re (12) sont g\u00e9r\u00e9es<\/li>\n<li>Accepte les donn\u00e9es &#8220;hors partition&#8221; : default partition et minvalue\/maxvalue (11)<\/li>\n<li>Possibilit\u00e9 d&#8217;utiliser des foreign patitions<sup>1<\/sup>:\n<ul>\n<li>Cela permet l&#8217;utilisation du pushdown<sup>2<\/sup> dans le cas de l\u2019utilisation de postgresql_fdw<\/li>\n<li>Pas de cr\u00e9ation d\u2019index depuis l\u2019instance locale sur la partition<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre>\r\n<em><sup>1<\/sup> D\u00e9conseill\u00e9 avant la 12, sauf si la Foreign Partition est en Read Only\r\n<sup>2<\/sup> Pushdown : l'instance locale demande \u00e0 l'instance distante des faire des actions comme le tri, certaines jointures avant de retourner les donn\u00e9es \u00e0 l'instance locale<\/em>\r\n<\/pre>\n<p>Les limites : <\/p>\n<ul>\n<li>Pas de cr\u00e9ation automatique des partitions\n<ul>\n<li>Discussion en cours dans ce sens<\/li>\n<li>Sauf avec extension ou script<\/li>\n<\/ul>\n<\/li>\n<li>Vous ne pouvez pas cr\u00e9er de nouvelle partition si une partition contient des donn\u00e9es qui devraient maintenant \u00eatre dans la nouvelle partition\n<ul>\n<li>Il faut d&#8217;abord cr\u00e9er une table, y d\u00e9placer les donn\u00e9es (en les supprimant de la partition actuelle), puis attacher la table \u00e0 la table partitionn\u00e9e<\/li>\n<\/ul>\n<\/li>\n<li>Les tables partitionn\u00e9es (parentes) ne peuvent pas contenir de donn\u00e9es, les donn\u00e9es sont obligatoirement dans les partitions<\/li>\n<li>Pas d&#8217;\u00e9criture possible dans la foreign partition en 10<\/li>\n<li>Pas d&#8217;autoanalyze (autovacuum) car la table racine ne contient pas de donn\u00e9es et donc elle n\u2019arrive jamais au nombre de lignes modifi\u00e9es d\u00e9clenchant l\u2019autovacuum<\/li>\n<li>Pas d&#8217;index globaux<\/li>\n<li>En version 10, les tables partitionn\u00e9es ne pouvaient pas avoir d\u2019index, ce qui emp\u00eachait la cr\u00e9ation de PK, FK, UK<\/li>\n<li>En version 10, il faut cr\u00e9er les index partition par partition<\/li>\n<\/ul>\n<p>Matrice de fonctionnalit\u00e9s h\u00e9ritage \/ d\u00e9claratif : <\/p>\n<table>\n<thead>\n<tr>\n<th>FEATURE<\/th>\n<th>9.6<\/th>\n<th>10<\/th>\n<th>11<\/th>\n<th>12<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Cr\u00e9ation automatique des index\/contraintes sur les tables filles<\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Partitionnement d\u00e9claratif <\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Routage automatique de ligne \u2013 INSERT<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Routage automatique de ligne \u2013 UPDATE<sup>3<\/sup><\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Unique index \/ Primary key<\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<sup>4<\/sup><\/td>\n<td>OUI<sup>4<\/sup><\/td>\n<\/tr>\n<tr>\n<td>Foreign keys <\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<sup>5<\/sup><\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Default Partitions <\/td>\n<td>OUI<sup>6<\/sup><\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Parallel Partition Scans<\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Foreign partitions<\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Routage automatique de ligne \u2013 UPDATE avec Foreign table : <\/td>\n<td><\/td>\n<td>Foreign table en read only<\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Table locale vers foreign table<\/td>\n<td><\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Foreign table vers table locale <\/td>\n<td><\/td>\n<td>NON<\/td>\n<td>NON<sup>7<\/sup><\/td>\n<td>OUI<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre>\r\n<em><sup>3<\/sup> UPDATE n\u00e9cessitant le changement de partition\r\n<sup>4<\/sup> L\u2019index\/PK doit contenir toutes les colonnes de la cl\u00e9 de partitionnement\r\n<sup>5<\/sup> Une table partitionn\u00e9e ne peut faire r\u00e9f\u00e9rence que \u00e0 une table non partitionn\u00e9e\r\n<sup>6<\/sup> Dans la table parente ou via le trigger\r\n<sup>7<\/sup> Contournement : n\u00e9cessite le couple DELETE + INSERT<\/em>\r\n<\/pre>\n<h2>Am\u00e9lioration des performances :<\/h2>\n<h3>Parall\u00e9lisme :<\/h3>\n<p>Depuis la version 9.6, le moteur int\u00e8gre la parall\u00e9lisation pour diff\u00e9rentes op\u00e9rations (uniquement en lecture). Depuis, chaque version majeure l\u2019\u00e9tend \u00e0 de nouveaux types de requ\u00eates.<br \/>\nParmi lesquels on peut trouver : <\/p>\n<ul>\n<li>Tris sur disque : Sort Method: external merge<\/li>\n<li>Table : Parallel Seq Scan<\/li>\n<li>Index : Index Scan, Bitmap heap scan, Index Only Scan <\/li>\n<li>Jointures : Nested-loop, merge join, parallel hash join <\/li>\n<li>Agr\u00e9gation : count, sum, &#8230; <\/li>\n<li>Union d\u2019ensembles : Append <\/li>\n<\/ul>\n<p>Depuis la version 12, tous les niveaux d\u2019isolations permettent de parall\u00e9liser les requ\u00eates. <\/p>\n<h3>Partition Pruning :<\/h3>\n<p>Le partition pruning consiste \u00e0 exclure les partitions inutiles. Postgres s\u2019appuie sur les contraintes d\u2019exclusion pour \u00e9carter des partitions \u00e0 la planification.<br \/>\nL\u2019algorithme n\u2019a pas \u00e9t\u00e9 pr\u00e9vu pour g\u00e9rer un nombre important de partitions. La version 11 int\u00e8gre un nouvel algorithme de recherche bien plus performant : Faster Partition Pruning. Il est effectif sur les requ\u00eates SELECT en 11, INSERT et COPY en 12.<br \/>\nLe moteur ne pouvait exclure des partitions que lors de la planification, depuis la 11 il peut aussi exclure lors de l\u2019ex\u00e9cution : c\u2019est le Runtime Partition Pruning. <\/p>\n<table>\n<thead>\n<tr>\n<th>Partition Pruning<\/th>\n<th>9.6<\/th>\n<th>10<\/th>\n<th>11<\/th>\n<th>12<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Optimizer Partition Elimination <\/td>\n<td>OUI<sup>8<\/sup><\/td>\n<td>OUI<sup>8<\/sup><\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>Executor Partition Elimination <\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<sup>9<\/sup><\/td>\n<td>OUI<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre>\r\n<em><sup>8<\/sup> Utilise les contraintes d\u2019exclusion\r\n<sup>9<\/sup> Uniquement sur les n\u0153uds de type APPEND<\/em>\r\n<\/pre>\n<table>\n<thead>\n<tr>\n<th>Faster Partition Pruning<\/th>\n<th>10<\/th>\n<th>11<\/th>\n<th>12<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>SELECT<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>INSERT<\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<\/tr>\n<tr>\n<td>COPY<\/td>\n<td>NON<\/td>\n<td>NON<\/td>\n<td>OUI<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Nouvelles fonctions :<\/h2>\n<p>Des clauses ont \u00e9t\u00e9 ajout\u00e9es aux commandes \u201cCREATE TABLE\u201d et \u201cALTER TABLE\u201d, notamment pour attacher (ATTACH PARTITION) et d\u00e9tacher (DETACH PARTITION) une partition. <\/p>\n<h3>Pour attacher une partition :<\/h3>\n<p>Alter table \u2026 attach partition \u2026 for values \u2026 ;<br \/>\nCette commande permet d\u2019attacher une table \u00e0 une table partitionn\u00e9e. Si la table parente \u00e0 des index et\/ou des contraintes, ils sont automatiquement cr\u00e9\u00e9s sur la partition.<br \/>\nEn 10 et 11, cette commande pose un verrou de niveau ACCESS EXCLUSIVE sur la table parente. Il est possible de contourner ce verrou en cr\u00e9ant une contrainte de type CHECK sur la table \u00e0 attacher d\u00e9crivant la contrainte de partition d\u00e9sir\u00e9e. Avec cette contrainte, la commande pose un verrou de niveau SHARE UPDATE EXCLUSIVE sur la table parente.<br \/>\nEn 12, il n\u2019y a plus de verrou sur la table parente. <\/p>\n<h3>Pour d\u00e9tacher une partition :<\/h3>\n<p>Alter table \u2026 detach partition \u2026 ;<br \/>\nCette commande permet de d\u00e9tacher une partition, cette derni\u00e8re conserve ses index et contraintes. D\u00e9tacher une partition pose, tr\u00e8s brievement, un verrou de type EXCLUSIVE sur la table parente.<br \/>\nExemple de cr\u00e9ation \/ attach \/ detach pour RANGE, LIST, HASH : <\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">-- Cr\u00e9er une table partitionn\u00e9e par LIST \r\nCREATE TABLE t1 (c1 integer, c2 test) PARTITION BY LIST (c1) ; \r\n-- Cr\u00e9er une partition \r\nCREATE TABLE t1_1 PARTITION OF t1 FOR VALUES IN (1, 2, 3) ; \r\n-- Attacher une partition \r\nALTER TABLE t1 ATTACH PARTITION t1_2 FOR VALUES IN (4, 5, 6) ; <\/pre>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">-- Cr\u00e9er une table partitionn\u00e9e par RANGE \r\nCREATE TABLE t2 (c1 integer, c2 test) PARTITION BY RANGE (c1) ; \r\n-- Cr\u00e9er une partition \r\nCREATE TABLE t2_1 PARTITION OF t2 FOR FROM (1) TO (100) ; \r\n-- Attacher une partition \r\nALTER TABLE t2 ATTACH PARTITION t2_2 FOR FROM (100) TO (200) ; <\/pre>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">-- Cr\u00e9er une table partitionn\u00e9e par HASH \r\nCREATE TABLE t3 (c1 integer, c2 test) PARTITION BY HASH (c1) ; \r\n-- Cr\u00e9er une partition \r\nCREATE TABLE t3_1 PARTITION OF t3 FOR VALUES WITH (modulus 2, remainder 0) ; \r\nCREATE TABLE t3_2 PARTITION OF t3 FOR VALUES WITH (modulus 2, remainder 1) ; <\/pre>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">-- D\u00e9tacher une partition  \r\nALTER TABLE t1 DETACH PARTITION t1_2 ; <\/pre>\n<p>PostgreSQL 12 ajoute trois nouvelles fonctions permettant de simplifier l\u2019acc\u00e8s \u00e0 certaines informations concernant une table partitionn\u00e9e. <\/p>\n<ul>\n<li>Pg_partition_tree(\u2018regclass\u2019) : Liste des informations sur les tables et index dans un arbre de partition pour une table ou un index partitionn\u00e9 donn\u00e9, avec une ligne par partition. Les informations fournies incluent le nom de la partition, le nom de son parent imm\u00e9diat, une valeur bool\u00e9enne indiquant si la partition est une feuille et un entier indiquant son niveau dans la hi\u00e9rarchie. La valeur du niveau commence \u00e0 0 pour la table ou l&#8217;index en entr\u00e9e dans son r\u00f4le de racine de l&#8217;arbre de partition, 1 pour ses partitions, 2 pour leurs partitions, et ainsi de suite (par rapport \u00e0 regclass)<\/li>\n<li>Pg_partition_ancestors(\u2018regclass\u2019) : Liste les relations anc\u00eatres de la partition donn\u00e9e, en incluant la partition elle-m\u00eame<\/li>\n<li>Pg_partition_root(\u2018regclass\u2019) : Renvoie la racine d&#8217;un arbre de partitionnement auquel la partition indiqu\u00e9e appartient<\/li>\n<\/ul>\n<p>Exemple :<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2-300x130.png\" alt=\"\" width=\"600\" height=\"260\" class=\"alignnone size-medium wp-image-8101\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2-300x130.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2-768x332.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/tree_part_2.png 810w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">select * from pg_partition_ancestors('t9_3_1'); \r\nrelid \r\n-------- \r\nt9_3_1 \r\nt9_3 \r\nt9 \r\n\r\nselect * from pg_partition_root('t9_3_1'); \r\npg_partition_root \r\n------------------ \r\nt9\r\n\r\nselect * from pg_partition_tree('t9_3'); \r\nrelid  | parentrelid | isleaf | level \r\n--------+-------------+--------+------- \r\nt9_3   | t9          | f      |     0 \r\nt9_3_1 | t9_3        | t      |     1 \r\nt9_3_2 | t9_3        | t      |     1 \r\n\r\nselect * from pg_partition_tree('t9'); \r\nrelid  | parentrelid | isleaf | level \r\n--------+-------------+--------+------- \r\nt9     |             | f      |     0 \r\nt9_1   | t9          | t      |     1 \r\nt9_2   | t9          | t      |     1 \r\nt9_3   | t9          | f      |     1 \r\nt9_3_1 | t9_3        | t      |     2 \r\nt9_3_2 | t9_3        | t      |     2 \r\n<\/pre>\n<h2>Wanted \/ Missing :<\/h2>\n<p>Malgr\u00e9 toutes ces \u00e9volutions, il manque encore quelques am\u00e9liorations : <\/p>\n<ul>\n<li>Cr\u00e9ation automatique de nouvelles partitions (type range)<\/li>\n<li>Pas de cr\u00e9ation de partition concernant les donn\u00e9es d\u00e9j\u00e0 existante (default partition ou avec minvalue\/maxvalue)<\/li>\n<li>Pas d&#8217;autoanalyze<\/li>\n<li>Pas d&#8217;index globaux<\/li>\n<\/ul>\n<h2>Conclusion :<\/h2>\n<p>Le partitionnement est une grosse \u00e9volution pour g\u00e9rer des bases de forte volum\u00e9trie. Il permet de gros gains de performance aussi bien en lecture\/\u00e9criture, en termes de maintenance et aussi de la gestion de la r\u00e9tention des donn\u00e9es (archivage, suppression, r\u00e9partition sur plusieurs tablespaces, \u2026).<br \/>\nIl manque encore quelques fonctionnalit\u00e9s pour que tout cela soit totalement transparent en termes d\u2019administration (autoanalyze, cr\u00e9ation automatique des partitions, \u2026). Ces manques seront corrig\u00e9s dans les prochaines versions majeures. <\/p>\n<p>Il est recommand\u00e9 d\u2019utiliser la version 11 ou 12 de PostgreSQL pour utiliser le partitionnement. La version 10 \u00e0 de grosses limitations, qui ont \u00e9t\u00e9 corrig\u00e9es dans les versions suivantes.<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8089&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8089&#038;title=PostgreSQL%20%3A%20%C3%A9volution%20du%20partitionnement%20de%209.6%20%C3%A0%2012%20%282%2F2%29\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=PostgreSQL%20%3A%20%C3%A9volution%20du%20partitionnement%20de%209.6%20%C3%A0%2012%20%282%2F2%29&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8089\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Dans l&#8217;article pr\u00e9c\u00e9dent nous avons vu les principes du partitionnement ainsi que l\u2019h\u00e9ritage. Ce second article traitera de la m\u00e9thode d\u00e9clarative ainsi que des am\u00e9liorations qui y sont li\u00e9es. Partitionnement d\u00e9claratif (natif) : Depuis la version 10, PostgreSQL propose le&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":8167,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[266],"tags":[342,344,348,343,341,346,232,345,340,339,338,347,349],"class_list":["post-8089","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql","tag-declaratif","tag-declarative","tag-elimination","tag-heritage","tag-natif","tag-parallel","tag-parallelisme","tag-partition","tag-partitionnement","tag-pg","tag-postgres","tag-pruning","tag-vacuum"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2) - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2) - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Dans l&#8217;article pr\u00e9c\u00e9dent nous avons vu les principes du partitionnement ainsi que l\u2019h\u00e9ritage. Ce second article traitera de la m\u00e9thode d\u00e9clarative ainsi que des am\u00e9liorations qui y sont li\u00e9es. Partitionnement d\u00e9claratif (natif) : Depuis la version 10, PostgreSQL propose le&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-22T16:23:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-22T16:27:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/alveoles-abeille-Thinkstock-153203503-200965_371x268.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"371\" \/>\n\t<meta property=\"og:image:height\" content=\"268\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Capdata team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Capdata team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\"},\"author\":{\"name\":\"Capdata team\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\"},\"headline\":\"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2)\",\"datePublished\":\"2019-11-22T16:23:29+00:00\",\"dateModified\":\"2019-11-22T16:27:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\"},\"wordCount\":1727,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"declaratif\",\"declarative\",\"Elimination\",\"h\u00e9ritage\",\"natif\",\"Parallel\",\"parallelisme\",\"partition\",\"partitionnement\",\"pg\",\"Postgres\",\"pruning\",\"vacuum\"],\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\",\"name\":\"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2) - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2019-11-22T16:23:29+00:00\",\"dateModified\":\"2019-11-22T16:27:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\",\"name\":\"Capdata team\",\"sameAs\":[\"https:\/\/www.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2) - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/","og_locale":"fr_FR","og_type":"article","og_title":"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2) - Capdata TECH BLOG","og_description":"Dans l&#8217;article pr\u00e9c\u00e9dent nous avons vu les principes du partitionnement ainsi que l\u2019h\u00e9ritage. Ce second article traitera de la m\u00e9thode d\u00e9clarative ainsi que des am\u00e9liorations qui y sont li\u00e9es. Partitionnement d\u00e9claratif (natif) : Depuis la version 10, PostgreSQL propose le&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2019-11-22T16:23:29+00:00","article_modified_time":"2019-11-22T16:27:07+00:00","og_image":[{"width":371,"height":268,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/11\/alveoles-abeille-Thinkstock-153203503-200965_371x268.jpg","type":"image\/jpeg"}],"author":"Capdata team","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Capdata team","Dur\u00e9e de lecture estim\u00e9e":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/"},"author":{"name":"Capdata team","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9"},"headline":"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2)","datePublished":"2019-11-22T16:23:29+00:00","dateModified":"2019-11-22T16:27:07+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/"},"wordCount":1727,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["declaratif","declarative","Elimination","h\u00e9ritage","natif","Parallel","parallelisme","partition","partitionnement","pg","Postgres","pruning","vacuum"],"articleSection":["PostgreSQL"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/","url":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/","name":"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2) - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2019-11-22T16:23:29+00:00","dateModified":"2019-11-22T16:27:07+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-evolution-du-partitionnement-de-9-6-a-12-2-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL : \u00e9volution du partitionnement de 9.6 \u00e0 12 (2\/2)"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9","name":"Capdata team","sameAs":["https:\/\/www.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8089","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=8089"}],"version-history":[{"count":35,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8089\/revisions"}],"predecessor-version":[{"id":8166,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8089\/revisions\/8166"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/8167"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=8089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=8089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=8089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}