1

Temat: Jak działa UPDATE?

Witam,

Mam do wykonania projekt dużej bazy danych. Jej sercem mają być dwie tablice, o dużej ilości rekordów (załóżmy że ok 2*10^6 na każdą). Mój szef chciałby, by wpis do jednej z nich robił UPDATE na odpowiednim polu w drugiej. Twierdzi, że to będzie "edytowanie w miejscu", które nie wpłynie znacznie na wydajność (do obu tablic będą dodawane nowe rekordy, wykonywane będą SELECTy).
Wydaje mi się, że nie ma racji, tylko nie mam rzeczowych argumentów. Stąd pytanie: jak właściwie działa UPDATE jednego pola? Czy wielokrotne wykonywanie UPDATE na pojedynczych rekordach wpłynie znacząco na wydajność?

Jeśli chodzi o strukturę tabeli to załóżmy że wygląda ona tak:
Tabela a:
id bigserial, 4* timestamp, 2* enum, 1* bigint, 1*int4;
Właśnie pole bigint będzie UPDATEowane.

2

Odp: Jak działa UPDATE?

3

Odp: Jak działa UPDATE?

OK, obecnie wygląda to tak:
Jeśli chodzi o 2*10^6 wierszy to taki górny pułap. Stosuję partycjonowanie, co jakiś czas przesuwam najstarsze rekordy do 'archiwalnej' tabeli.

W tabeli a mamy rekordy oznaczające rozpoczęte prace. Uruchamiana z zewnątrz funkcja przeszukuje tabelę a, gdy znajdzie pasujący rekord dokonuje 'zamknięcia pracy' (załóżmy że robi update jednej kolumny typu bool z false na true oraz update kolumny bigint). Najczęściej jeden wiersz będzie edytowany tylko raz, jednak będą takie wiersze które będą edytowane kilka razy. W tej chwili mam założone dwa indeksy w tej tabeli, żaden z nich nie jest na edytowanych polach. Zaobserwowałem już, że najczęściej po update pozostaje mi po 1 dead row na każdy update'owany wiersz.

To nad czym się zastanawiam to wpływ update na szybkość działania select'ów na tej tabeli, czy bardzo rozwali to indexy? Czytałem trochę o fillfactor, tak w stosunku do tabeli jak i do indeksu, czy ustawienie FILLFACTOR = 50 w tabeli będzie miało jeszcze jakieś konsekwencje poza zwiększeniem się jej rozmiarów (dwukrotnie?) i czy w ogóle może to mi pomóc w tej sytuacji?

Drugim pomysłem by zastąpić update było tworzenie nowego rekordu po 'zamknięciu pracy', bez usuwania poprzedniego, ale to szybko mogłoby doprowadzić tabelę do monstrualnych rozmiarów, zwłaszcza gdy niektóre prace można 'zamykać' kilka razy.
Zastanawiałem się czy może ktoś tutaj miał już wcześniej doświadczenie z podobną sytuacją, bo nie bardzo mogę wymyślić dobry sposób obejścia całego tego używania update.