Vastus (07.04.2024 14:15): Süntaksi mõttes on see tehtav ja annaks soovituse tulemus, kuid PostgreSQL (16) näitel oleks see halva jõudlusega lahendus.
Vaatame näidet.
Andmebaasis on tabel
Health_care_visit, kus on üks miljon rida.
Ülesanne: Suurenda 2020. aastal alanud visiitide visiiditasu 10%. NB! 2020. aastal ei alanud ühtegi visiiti.
Lahendus 1: Otsingu tingimus on WHERE klauslis.
UPDATE Health_Care_visit SET visit_fee=visit_fee*1.1
WHERE Extract(YEAR FROM from_date)=2020;
Lahendus 2: Otsingutingimuse WHERE klauslisse kirjapaneku asemel kasutan SET klauslis
CASE avaldist, mis leiab iga rea korral uue visiiditasu (võib jääda samaks või olla senisest 10% suurem).
UPDATE Health_Care_visit SET visit_fee=CASE WHEN Extract(YEAR FROM from_date)=2020 THEN visit_fee*1.1 ELSE visit_fee END;
Käivitan mõlemad laused ning vaatan
EXPLAIN ANALYZE lause abil täitmisplaani ja täitmise aega. NB! Kuna EXPAIN ANALYZE korral lause täidetakse, siis panen andmemuudatused transaktsiooni plokki, mille lõpuks tagasi rulline, et andmebaasis andmed püsivalt ei muutuks.
Lahendus 1: Süsteem loeb kõiki tabeli plokke ja filtreerib välja read, mis vastavad tingimusele ja mida tuleks uuendada. Lause täitmiseks kulus 254 ms.
Lahendus 2: Süsteem loeb kõiki tabeli plokke ja uuendab kõiki tabeli ridu (arvutab iga rea korral välja CASE avaldise tulemuse ning kirjutab selle visit_fee välja).
Lause täitmiseks kulus 24252 ms e 95 korda rohkem aega.