Jak przyspieszyć archiwizację tabeli

0

Witajcie,

W bazie PostgreSQL istnieje funkcja archive();

jej kod wygląda mniej więcej tak:

insert into arch.zdarzenia_arch 
  (select * from log.zdarzenia z where z.data_zmiany <= now() - interval '30 day');
  --
  delete from log.zdarzenia where idx_zdarzenia in (
   select z.idx_zdarzenia from log.zdarzenia z where z.data_zmiany <= now() - interval '30 day');

Niestety na dzień dzisiejszy tabela log.zdarzenia spuchła tak bardzo, że jest w niej ponad 16 mln rekordów (nie ma to jak zapomnieć o archwiwizacji). Sam count wykonywał się kilkanaście minut (sprzęt też nie jest zbyt wysokich lotów). W związku z powyższym odpalenie procedury na obecnym zbiorze danych wykonuje się kilka jeśli nie kilkanaście godzin (póki co jeszcze się nie skończyło). Mimo iż na polu data_zmiany jest indeks to i tak trwa to strasznie długo. Macie pomysł jak to przyspieszyć na obecnej spuchniętej tabeli?

0

Kopiować paczkami po kilka tysięcy rekordów, co jakiś czas shrinkować log.

0

@somekind a możesz jakiś przykład rzucić? Myślałem o tym aby robić loop po 1000 rekordów potem commit i rekurencyjnie sobie prockę odpalać w postgre8.4 nie da się zrobić commita wewnątrz funkcji.

0

Nie znam się na Postgre... Ale tak bym kombinował, żeby w skrypcie mieć zamknięte w transakcji np. przeniesienie 5000 rekordów i ich usunięcie, oczywiście w pętli, póki jeszcze jakieś rekordy są.

0

@somekind w funkcjach PostgreSQL nie da się zrobić commita wewnątrz funkcji dlatego paczki odpadają. Ogarnąłem temat pisząc na szybko aplikację w delphi i odpalając procedurę która bierze paczki po 1000 rekordów. Działa szybko cyklicznie i dość stabilnie (bo użyłem rekurencji) także temat do zamknięcia.

0

@woolfik, a jak wygląda u Ciebie sprawa indeksów/pk etc. w tabeli arch.zdarzenia_arch ?

0

@Mikajlo8 na bazie są odpowiednie indeksy, pk, fk a nawet constrainty pilnujące integralności danych. Jednak tak jak pisałem wcześniej serwer nie jest prawdziwym serwerem (w sensie hardware) stąd takie problemy. Gość, który miał robić backupy się zwolnił prawie 3 lata temu i nikomu nie przekazał aby archiwizację robić. Na szczęście moją aplikację przerobiłem na usługę i będzie przeprowadzać archiwizacje bez wiedzy usera :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1