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.
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).
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.
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.
Hinda postitust:
Keskmine hinne : 5.0