Kvůli PostgreSQL MVCC, UPDATE
je v podstatě velmi podobný DELETE
plus INSERT
. S výraznou výjimkou opečených hodnot - viz:
- Přepíše Postgres při aktualizaci celý řádek?
(A drobné rozdíly pro n-tice pouze pro haldu - DELETE
+ INSERT
spustí nový HOT řetěz – ale to nemá žádný vliv na daný případ.)
Abychom byli přesní, řádek „smazáno“ je prostě neviditelný pro jakoukoli transakci začínající po potvrzení odstranění a vysátý později. Na straně databáze, včetně manipulace s indexy, tedy ve skutečnosti není žádný rozdíl mezi dvěma výroky. (Platí výjimky, čtěte dál.) Trochu to zvyšuje síťový provoz (v závislosti na vašich datech) a vyžaduje trochu analýzy.
Po vstupu @araqnid jsem studoval HOT aktualizace a provedl jsem nějaké testy. Aktualizace sloupců, které ve skutečnosti nemění hodnotu, nemají žádný rozdíl co se týče HOT aktualizací. Moje odpověď platí. Podrobnosti viz níže.
To platí také pro opečené atributy, protože na ty se také nesáhne, pokud se hodnoty ve skutečnosti nezmění .
Nicméně , pokud používáte spouštěče pro jednotlivé sloupce (uvedeno na str. 9.0), může to mít nežádoucí vedlejší účinky!
Cituji manuál ke spouštěčům:
... příkaz jako
UPDATE ... SET x = x ...
spustí spouštěcí oncolumnx
, i když se hodnota sloupce nezměnila .
Tučné zdůraznění moje.
Abstrakce vrstvy jsou pro pohodlí. Jsou užitečné pro vývojáře negramotné v SQL nebo v případě, že aplikace musí být přenositelná mezi různými RDBMS. Na druhou stranu mohou snížit výkon a zavést další body selhání. Vyhýbám se jim, kde je to možné.
AKTUALIZACE HOT (pouze halda)
Heap-Only Tuples byly představeny s Postgres 8.3 s důležitými vylepšeními v 8.3.4 a 8.4.9.
Poznámky k vydání pro Postgres 8.3:
UPDATE
s aDELETE
s zanechávají za sebou mrtvé n-tice, stejně jako neúspěšnéINSERT
s. Dříve pouzeVACUUM
mohl získat zpět prostor zabraný mrtvými n-ticemi. WithHOT mrtvý n-tice prostor lze automaticky získat zpět v okamžikuINSERT
neboUPDATE
Pokud v indexovaných sloupcích nebudou provedeny žádné změny . To umožňuje konzistentnější výkon. HOT také zabraňuje přidávání duplicitních položek rejstříku.
Důraz můj. A "žádné změny" zahrnuje případy, kdy jsou sloupce aktualizovány se stejnou hodnotou, jakou již mají. Vlastně jsem testoval , protože jsem si nebyl jistý.
Nakonec to potvrzuje rozsáhlý soubor README.HOT ve zdrojovém kódu.
Opečené sloupce také nestojí v cestě HOT aktualizacím. HOT aktualizovaná n-tice se pouze propojuje se stejnou nezměněnou n-ticí v rozvětvení toastu vztahu. HOT aktualizace dokonce pracují s opečenými hodnotami v cílovém seznamu (ve skutečnosti změněnými nebo ne). Pokud dojde ke změně opečených hodnot, znamená to samozřejmě zápisy do vidlice vztahu toastu. To vše jsem také testoval.
Neberte mě za slovo, přesvědčte se sami. Postgres poskytuje několik funkcí pro kontrolu statistik. Spusťte UPDATE
se všemi sloupci a bez nich a zkontrolujte, zda je v tom nějaký rozdíl.
-- Number of rows HOT-updated in table:
SELECT pg_stat_get_tuples_hot_updated('table_name'::regclass::oid)
-- Number of rows HOT-updated in table, in the current transaction:
SELECT pg_stat_get_xact_tuples_hot_updated('table_name'::regclass::oid)
Nebo použijte pgAdmin. Vyberte svou tabulku a v hlavním okně si prohlédněte kartu „Statistika“.
Uvědomte si, že HOT aktualizace jsou možné pouze v případě, že je na stejné stránce hlavní relační větve místo pro novou verzi n-tice. Jedním jednoduchým způsobem, jak vynutit tuto podmínku, je otestovat malou tabulku, která pojme pouze několik řádků. Velikost stránky je obvykle 8 kB, takže na stránce musí být volné místo.