Je suis nouveau à Postgres,
J'ai une table de 20 millions de lignes sur un serveur en direct - j'ai besoin de supprimer la plupart des rangées mais pas toutes. Je veux faire cela sans impact sur les autres processus de lecture/écriture accédant à ce tableau (très fréquemment).
J'ai un moyen de supprimer environ 100-400k morceaux de rangée à la fois. Entre chaque Supprimer, je veux faire le sommeil de la requête - afin que d'autres opérations puissent avoir une chance d'accéder à cette table.
J'ai le code, mais je crois en cette version, il verrouille la table dans tout le temps que la requête fonctionne (avec tous les couchages). Comment puis-je réellement libérer la table pendant que le processus dort? Merci!!
Mon code jusqu'à présent:
CREATE SEQUENCE tmp_sq increment by 1 minvalue 1 maxvalue 53 start with 1;
DO $$
DECLARE
w_counter integer;
BEGIN
w_counter := (SELECT nextval('tmp_sq'));
while w_counter < 53 loop
raise notice 'Value: %', w_counter ;
w_counter := (SELECT nextval('tmp_sq'));
-- this way of breaking up the delete into chunks works for my table because of dates.
delete from table_a where date_part('week',my_date) = w_counter;
raise notice ' Rows Were Deleted ';
--sleep
raise notice 'Sleeping Now.....';
perform pg_sleep(60);
end loop;
END $$;
La table elle-même est uniquement verrouillée en mode exclusif de rangée, ce qui ne devrait pas empêcher d'opérations normales sur la table, uniquement des choses comme la chute, la modification et la création d'index.
Chaque rangée individuelle étant supprimée sera verrouillée pendant la durée. Cela ne devrait bloquer que d'autres processus si ces autres processus tentent de mettre à jour les lignes (ou de les supprimer eux-mêmes). Normalement, avec des suppressions en vrac, vous supprimez des rangées que personne d'autre s'en soucie, ce qui signifie que personne d'autre n'essayera de les mettre à jour.
Si vous avez vraiment besoin de déverrouiller toutes les lignes supprimées et la table périodiquement, vous devez effectuer chaque boucle des suppressions dans une transaction séparée. Il n'y a pas de moyen facile de le faire dans un blocage de la totalité car le bloc complet fonctionne dans une seule transaction. Donc, vous devriez mettre votre boucle à l'extérieur de PostgreSQL, comme à Bash, Perl, Python, etc.