PostgreSQL EXCLUDE kitsendus: millal seda kasutada ning miks ilmub see kõikides näidetes fraasi "EXCLUDE USING gist" kujul?

Postitas Erki Eessaar
EXCLUDE on PostgreSQLi laiendus - SQL standard seda ette ei näe ja teised andmebaasisüsteemid seda ei paku. Kuid see on väga kasulik laiendus. See on UNIQUE kitsenduse üldistus selles mõttes, et unikaalsuse kontrollimisele saab kasutada väärtuste võrdlemiseks ka muid operaatoreid kui =. Näiteks saab selle abil andmebaasi tasemel deklaratiivsel viisil tagada, et tabelis esitatud ajaliste väärtuste perioodid ei oleks osaliselt ega täielikult kattuvad. Näiteks, kui isikule X on määratud roll Y ajaperioodiks 1. jaanuar 2021 kuni 31. detsember 2021, siis ei saa talle seda sama rolli määrata ajaperioodiks 1. märts 2021 kuni 1. juuni 2021 või 1. märts 2021 kuni 31. detsember 2022.  See on "kangem" unikaalsuse kontroll kui UNIQUE (isik_id, rolli_kood, alguse_aeg).

EXCLUDE abil saaks kontrollida ka tavalist unikaalsust, kuid kontrolli töökiiruse (aeglasem kui tavalise UNIQUE kontroll) ja porditavuse (teistesse süsteemide ülekandmise) mõttes pole see hea lahendus. EXCLUDE kitsenduse abil saab realiseerida ka kontrolle, mida muidu tuleks teha (osaliselt) unikaalse indeksiga.
  • Tõstutundetu unikaalsus. Näiteks kui tabeli Isik veerus e_meil on juba mingis väljas aadress 'kask@hot.ee', siis ei saa sinna tabelisse lisada aadressi 'Kask@hot.ee'.
  • Osaline unikaalsus. Näiteks, aktiivses seisundis kaupade nimetused peavad olema unikaalsed. Kui kaup ei ole aktiivses seisundis, siis selle nimetus ei pea olema unikaalne.
Unikaalsuse kitsenduse kontrollimise toetuseks loob PostgreSQL automaatselt B+ puu tüüpi indeksi (indeksitüübi nimeks on küll B-puu, kuid realisatsioon vastab B+ puule, sest viited ridadele on ainult puu lehtedes). Kujutage ette, mis juhtuks ilma indeksita - tabelis on miljon rida, tabelisse lisati uus rida, reas oleva väärtuse unikaalsuse kontrollimiseks tuleks süsteemil kõik need read läbi vaadata. Mida rohkem oleks tabelis ridu, seda rohkem tuleks kontrollimiseks tööd teha (andmeid lugeda) ja seda aeglasemaks muutuks kontrollimine. See, kui süsteemi töökiirus langeb, mida rohkem süsteemi kasutatakse, vastab töökiiruse antimustrile hüppelaud (ramp).

Ka EXCLUDE kitsenduse toetuseks vajab andmebaasisüsteem indeksit. Arvestades võrdluseid, mida süsteem peab EXCLUDE kitsenduse täidetuse kontrollimiseks läbi viima, ei sobi B+ puu tüüpi indeks, vaid sobib indeks tüüpi GIST.

SIIN on EXCLUDE kitsenduse kasutamise koodinäiteid.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!