Czy warto uruchamiać VACUUM na stole, który otrzymuje tylko INSERT?

19

W przemówieniu dotyczącym reventusa w 2015 r. AWS wspomniało, że odkurzanie powinno być uruchamiane nie tylko po aktualizacji lub usunięciu, ale także po wstawieniu. Oto odpowiednia część rozmowy:

http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s

Podobno istnieje pewne czyszczenie, które należy wykonać na blokach, nawet jeśli otrzymały one tylko wstawki, i to czyszczenie można wykonać albo przy pierwszym wyborze bloku (spowolnienie odczytów), albo podczas próżni. Czy to prawda, a jeśli tak, to jakie dokładnie porządki należy wykonać?

foobar0100
źródło

Odpowiedzi:

15

tl; dr: Pierwszy proces, który odczytuje dane po zatwierdzeniu, ustawi bity podpowiedzi. Spowoduje to zabrudzenie strony, tworząc aktywność zapisu. Inną rzeczą VACUUM(ale nie innymi poleceniami) jest oznaczenie strony jako całkowicie widocznej, jeśli to właściwe. VACUUMw końcu będzie musiał trafić na stół, aby zamrozić krotki.

Praca, którą należy wykonać po wstawieniu, nie jest tak naprawdę porządkiem, a przynajmniej nie w sensie innej VACUUMnormalnej pracy . Zanim przejdę do szczegółów, zauważ, że ta odpowiedź jest oparta na bieżącym (niepublikowanym) kodzie 9.6 i ignoruję efekty replikacji strumieniowej, nawet jeśli może to mieć wpływ na widoczność.

Z powodu MVCC za każdym razem, gdy Postgres ocenia, czy krotka powinna być widoczna dla zapytania, musi rozważyć, czy transakcja, która utworzyła krotkę (zapisaną w polu ukrytym xmin), została zatwierdzona, a także niektóre inne kryteria. Ten czek jest kosztowny, więc gdy tylko wiadomo, że transakcja jest widoczna dla wszystkich aktualnie otwartych transakcji, w nagłówku krotki ustawia się „bit podpowiedzi”. Ustawienie tego bitu zabrudzi stronę, co oznacza, że ​​będzie musiała zostać zapisana na dysk. Może to być bardzo mylące, jeśli następnym poleceniem odczytu danych SELECTjest nagle ruch generujący duży ruch. Uruchamianie VACUUMpo zatwierdzeniu wstawiania pozwoli tego uniknąć. Innym ważnym rozróżnieniem jest toVACUUMZAWSZE zasygnalizuje krotki na stronie (o ile uzyskała blokadę czyszczenia na stronie), ale większość innych poleceń podpowie tylko, jeśli transakcja wstawiania została zatwierdzona przed uruchomieniem polecenia.

Ważną kwestią VACUUMzwiązaną z pisaniem wszystkich tych bitów podpowiedzi jest to, że można je dławić (a domyślnie dławienie automatyczne jest dławione). Inne polecenia nie są ograniczane i będą generować brudne dane tak szybko, jak to możliwe.

VACUUMjest jedyną metodą oznaczania stron jako widocznych, co jest ważnym czynnikiem uwzględniającym wydajność niektórych operacji (w szczególności skanowanie tylko indeksu). Jeśli zrobisz dużą wstawkę, jest bardzo prawdopodobne, że istnieje wiele stron zawierających wyłącznie nowo wstawione krotki. VACUUMmoże potencjalnie oznaczyć te strony jako całkowicie widoczne, ale tylko wtedy, gdy najstarsza uruchomiona transakcja po VACUUMuruchomieniu była nowsza niż transakcja, która wstawiła dane .

Z powodu działania MVCC krotki, które zostały wstawione ponad ~ 2 miliardy transakcji temu, muszą być oznaczone jako „ zamrożone ”. Domyślnie uruchamia się autovacuum, aby to robić co 200 mln transakcji. Uruchomienie ręcznego odkurzania przy ustawieniu Vacuum_freeze_min_age na 0 po masowym wstawieniu może pomóc w zmniejszeniu tego wpływu. Bardziej agresywnie, VACUUM FREEZEpo włożeniu możesz biegać po stole. Spowodowałoby to „zresetowanie zegara”, gdy miałoby nastąpić następne skanowanie z zatrzymaniem.

Jeśli chcesz poznać szczegółowe informacje, spójrz na HEAPTUPLE_LIVEobudowę po wezwaniu do HeapTupleSatisfiesVacuum()środka lazy_scan_heap(). Zobacz także HeapTupleSatisfiesVacuum()siebie i porównaj to HeapTupleSatisfiesMVCC().

Są jeszcze dwie moje prezentacje, które mogą być interesujące. Pierwsze wideo jest dostępne pod adresem http://www.pgcon.org/2015/schedule/events/829.en.html , a drugie (które moim zdaniem było nieco lepsze) na https://www.youtube. com / watch? v = L8nErzxPJjQ

Jim Nasby
źródło
Jest to bardzo interesujące, a także wyjaśnia niektóre brudne strony w niektórych EXPLAIN (ANALYZE, BUFFERS) outputs. But, if I understand things correctly, some of the hint bits (at least * COMMITTED` i *INVALID) można (można) już ustawić za pomocą COMMITlub ROLLBACK, prawda?
dezso
3
COMMIT i ROLLBACK rzeczywistości nie dotykać strony danych, więc nie, te polecenia specjalnie nigdy nie mógł schować. Polecenie DML nadal może ustawiać status podpowiedzi xmin i xmax, dla krotek oznaczonych innymi transakcjami lub potencjalnie krotek oznaczonych przez bieżącą transakcję.
Jim Nasby