Probleemi tuum seisneb selles, et vanemates andmebaasimootorites nõuab uue veeru lisamine koos vaikeväärtusega (DEFAULT FALSE) kogu tabeli füüsilist ümberkirjutamist (kõik read tuleb kettalt lugeda, uus väärtus lisada ja tagasi kirjutada). Selle protsessi ajaks pannakse tabelile eksklusiivne lukk (exclusive lock), mis tähendab seisakut ehk downtime'i.
Selle ilma seisakuta (zero-downtime) läbiviimise võimalused sõltuvad kasutatavast andmebaasisüsteemist ja selle vanusest.
PostgreSQL 11 ja uuemad: See probleem lahendati juba ammu. Uue veeru lisamine konstantse vaikeväärtusega (nagu FALSE) on nüüd silmapilkne. PostgreSQL ei kirjuta enam tabelit ümber, vaid salvestab metaandmetesse, et "kui real puudub sellele veerule vastav, tagasta lennult FALSE".
Näide: PostgreSQL (18) põhjal. Käivitan lauseid psqlis.
Tabelis Health_care_visit on 1 miljon rida.
experiment_views=# \timingTiming is on.experiment_views=# ALTER TABLE Health_Care_visit ADD COLUMN is_verified BOOLEAN NOT NULL DEFAULT FALSE;ALTER TABLETime: 12,735 msOperatsioon toimus väga kiiresti.
Klassikaline mitmesammuline meetod, mida sellises olukorras ka soovitatakse, on tegelikult palju aeglasem.
experiment_views=*# ALTER TABLE Health_Care_visit ADD COLUMN is_verified BOOLEAN;ALTER TABLETime: 0,932 msMärkus: See operatsioon on silmapilkne. Andmebaasisüsteem muudab ainult metaandmeid kataloogis, tabeli ridu ei puuduta. Kõik olemasolevad read saavad automaatselt NULL markeri.
experiment_views=*# ALTER TABLE Health_Care_visit ALTER COLUMN is_verified SET DEFAULT FALSE;ALTER TABLETime: 0,781 msMärkus: Ka see on silmapilkne metaandmete muudatus. Alates sellest hetkest saavad kõik uued read, mis andmebaasi lisatakse, väärtuseks FALSE. Varasemad read on endiselt NULLidega.
experiment_views=*# UPDATE Health_Care_visit SET is_verified=FALSE;UPDATE 1000000Time: 32509,846 ms (00:32,510)Märkus: Seda soovitatakse teha ridade portsude kaupa, mitte korraga.
experiment_views=*# ALTER TABLE Health_Care_visit ALTER COLUMN is_verified SET NOT NULL;ALTER TABLETime: 229,398 ms