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. VACUUM
w 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 VACUUM
normalnej 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 SELECT
jest nagle ruch generujący duży ruch. Uruchamianie VACUUM
po zatwierdzeniu wstawiania pozwoli tego uniknąć. Innym ważnym rozróżnieniem jest toVACUUM
ZAWSZE 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ą VACUUM
zwią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.
VACUUM
jest 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. VACUUM
może potencjalnie oznaczyć te strony jako całkowicie widoczne, ale tylko wtedy, gdy najstarsza uruchomiona transakcja po VACUUM
uruchomieniu 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 FREEZE
po 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_LIVE
obudowę 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
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ąCOMMIT
lubROLLBACK
, prawda?