Vous n'êtes pas identifié(e).
Bonjour,
J'utilise le partitionning dans Postgres 12 (avec INHERITS) sur des intervalles de date mensuels. Quand je lance un vacuum full directement sur une "vieille" partition qui peut durer plusieurs minutes, mes autres requêtes d'écriture et même de lecture sont bloquées pendant ce temps. les requêtes de lectures passent par la table principale en précisant un intervalle de date "récent" (ne contenant pas la partition en cours de vacuum).
sur une requête de select "bloquée", je vois un AccessShareLock granted à true sur toutes les partitions sauf à false sur celle en cours de vacuum
La résolution par le planner des partitions impactées pour le select ne peut pas se faire si une des partitions est lockée ?
c'est gênant à l'usage. casser le lien d'héritage le temps du vacuum est-elle la seule solution ?
Je ne sais pas si le partitioning déclaratif change quelque chose à ce niveau ? ou sur une version plus récente de postgres ?
Merci
Hors ligne
Bonjour,
casser le lien d'héritage le temps du vacuum est-elle la seule solution ?
Avec l'héritage de table oui.
Le partitionnement déclaratif n'a pas ce problème, c'est d'ailleurs testable en moins de 2 minutes si vous voulez vérifier.
Julien.
https://rjuju.github.io/
Hors ligne
En ce qui concerne "casser le lien d'héritage".
Il faut savoir qu'avec l'héritage, sortir une table de la hiérarchie et la remettre n'est pas une opération neutre.
Une fois que la table fille est remise dans la hiérarchie, les modifications de colonnes existantes du parent ne sont plus propagées dans la table fille comme avant.
Plusieurs utilisateurs comme moi ont signalé ça comme un bug tant c'est surprenant, mais il s'avère que ce n'est pas un bug, c'est conçu comme ça.
Exemple:
DROP TABLE IF EXISTS parent_tbl CASCADE;
CREATE TABLE parent_tbl(f1 int, f2 int, f3 int);
CREATE TABLE child1_tbl() INHERITS(parent_tbl);
CREATE TABLE child2_tbl() INHERITS(parent_tbl);
CREATE TABLE child3_tbl() INHERITS(parent_tbl);
ALTER TABLE child2_tbl NO INHERIT parent_tbl;
ALTER TABLE child2_tbl INHERIT parent_tbl;
ALTER TABLE parent_tbl DROP COLUMN f2;
\d child*_tbl
Table "public.child1_tbl"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
f1 | integer | | |
f3 | integer | | |
Inherits: parent_tbl
Table "public.child2_tbl"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
f1 | integer | | |
f2 | integer | | |
f3 | integer | | |
Inherits: parent_tbl
Table "public.child3_tbl"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
f1 | integer | | |
f3 | integer | | |
Inherits: parent_tbl
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Merci, je vais essayer avec le partitionnement déclaratif alors !
Hors ligne