Kas PostgreSQLis ON DELETE CASCADE kasutamine välisvõtme deklaratsioonis põhjustab halba kustutamise töökiirust e jõudlust?

Postitas Erki Eessaar 12.06.2023 13:33 (muudeti 12.06.2023 16:27)
Ei tekita.

Põhjendan vastust. Tegin katsetusi PostgreSQL 15 andmebaasis, millel on järgmine kontseptuaalne struktuur:

[Facility]-0..1-----------------0..*-[Health_care_visit]

Tabel Facility: 50 000 rida
Tabel Health_care_visit: 1 000 00 rida

Tabelis Health_care_visit on 6 rida, kus facility_id=200
Tabelis Health_care_visit on indeks veerul facility_id.

Katsetasin kahe ülesande täitmist:
  • Ül1: Kustuta tervishoiuasutus, mille id=200 ja selle asutusega seotud külastused.
  • Ül2: Kustuta kõik tervishoiuasutused ja nende asutustega seotud külastused.

Katsetasin nende ülesanne täitmist kahe andmebaasi disaini korral.
  • D1: Välisvõtme kitsendusega on seotud ON DELETE CASCADE kompenseeriv tegevus. See tähendab, et kustutasin ridu ainult tabelist Facility ja seotud read kustutati kaskaadselt tabelist Health_care_visit.
    • DELETE FROM Facility WHERE facility_id=200;
    • DELETE FROM Facility;
  • D2: Välisvõtme kitsendusel ei ole ON DELETE CASCADE kompenseerivat tegevust. See tähendab, et kõigepealt tuli kustutada read tabelist Health_care_visit ja siis sai kustutada read tabelist Facility.
    • DELETE FROM Health_care_visit WHERE facility_id=200;
      DELETE FROM Facility WHERE facility_id=200;
    • DELETE FROM Health_care_visit;
      DELETE FROM Facility;
Viisin iga ülesande ja disaini paari korral kustutamist läbi viis korda ja leidsin süsteemi kulutatud aja (lausete täitmisplaani koostamine + plaani täitmine) keskmise

Ül1, D1 (ON DELETE CASCADE): 0.94 ms
Ül1, D2 (ON DELETE NO ACTION): 0.77 ms

Ül2, D1 (ON DELETE CASCADE): 4975 ms
Ül2, D2 (ON DELETE NO ACTION): 7409,204 ms

Nagu näha, siis primaarsest tabelist (vanemtabelist) ühe rea kustutamisel oli ON DELETE CASCADE lahendus veidi aeglasem, kuid mõlemad lahendused olid aktsepteeritava töökiirusega.

Primaarsest tabelist (vanemtabelist) kõikide ridade kustutamisel oli ON DELETE CASCADE lahendus palju kiirem, kusjuures operatsiooni läbiviimine võttis mõlemal juhul palju aega.

Kokkuvõttes järeldan, et töökiirus ei peaks olema argument, miks ON DELETE CASCADE mitte kasutada.

NB! Eelnev näide põhineb ühel andmebaasisüsteemi versioonil. Teistes andmebaasisüsteemides või versioonides võivad tulemused olla erinevad.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!