Kodulehed
[381] - Andmebaasid II (ITI0207) (sügis 2021)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid.
Värvilised mummud tähistavad hinnangulist kataloogide lugemise vajadust. Roheline - suurim, kollane - keskmine, punane või mummuta - väikseim
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / Andmebaasisüsteemid (Üldine)

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Erki Eessaar (12.11.2021 20:37):
Tooge palun mõni andmebaasisüsteemi poolt tehtava semantilise teisenduse näide?!
Vastus: Andmebaasisüsteemi poolne päringu lihtsustamine tähendab, et andmebaasisüsteem asendab kasutaja poolt ette antud päringu lihtsama, kuid alati samasuguse tulemuse andva päringuga (loogiliselt samaväärse päringuga) ja täidab selle uue päringu. Lihtsama päringu täitmine peaks toimuma kiiremini.

Suur klass lihtsustusi põhineb andmebaasis deklareeritud kitsendused. Andmebaasisüsteem saab teha selliseid lihtsustuse teisendusi, kuna saab tänu jõustatud kitsendustele andmete kohta midagi eeldada. Kuna kitsendused kirjeldavad andmebaasisüsteemi jaoks andmete tähendust (semantikat), siis nimetatakse selliseid lihtsustusi semantilisteks teisendusteks.

Üheks selliseks teisenduseks on tabeli elimineerimise teisendus (table elimination transformation, join elimination transformation), mida oskavad suuremal või vähemal määral teha mitmed SQL-andmebaasisüsteemid sh PostgreSQL ja Oracle. See teisendus tähendab, et kui päringus ühendatakse tabelit, mida päringu tulemuse saavutamiseks pole tegelikult vaja lugeda, siis jäetakse see ühendamisoperatsioon ära ja eemaldatakse päringust viited sellele ühendatavale tabelile.

Näide (tabelite loomise laused on Oracle andmebaasisüsteemi jaoks).

CREATE TABLE Isik (isik_id NUMBER(10),
e_meil VARCHAR2(254) NOT NULL,
eesnimi  VARCHAR2(1000) NOT NULL,
perenimi VARCHAR2(1000),
CONSTRAINT pk_isik PRIMARY KEY (isik_id),
CONSTRAINT ak_isik_e_mail UNIQUE (e_meil));

CREATE TABLE Tootaja (isik_id NUMBER(10),
CONSTRAINT pk_tootaja PRIMARY KEY (isik_id),
CONSTRAINT fk_tootaja_isik FOREIGN KEY (isik_id) REFERENCES Isik (isik_id) ON DELETE CASCADE);

CREATE TABLE Tuba (tuba_kood NUMBER(10),
registreerija_id NUMBER(10) NOT NULL,
CONSTRAINT pk_tuba PRIMARY KEY (tuba_kood),
CONSTRAINT fk_tuba_tootaja FOREIGN KEY (registreerija_id) REFERENCES Tootaja (isik_id));


Iga töötaja on ühtlasi isik. Tänu andmebaasi struktuurile ja jõustatud kitsendustele on tagatud, et iga tabelis Tuba olev registreerija_id väärtusele vastab isik_id väärtus tabelis Isik.

Järgnev päring ühendab kokku tabelites Isik, Tootaja ja Tuba olevad andmed. Tabelist Tootaja ei väljastata andmeid ühestki veerust. Päringu tulemust ei piirata tabelis Tootaja olevate andmete alusel.

SELECT e_meil, eesnimi, perenimi, tuba_kood
FROM Isik INNER JOIN Tootaja ON Isik.isik_id=Tootaja.isik_id
INNER JOIN Tuba ON Tuba.registreerija_id=Tootaja.isik_id;

See päring on loogiliselt samaväärne järgneva päringuga.

SELECT e_meil, eesnimi, perenimi, tuba_kood
FROM Isik INNER JOIN Tuba ON Tuba.registreerija_id=Isik.isik_id;

Kas andmebaasisüsteemid oskavad esimest päringut lihtsustada, et see oleks nagu teine päring?
  • Oracle 12c Enterprise Edition Release 1 oskab (vt vastusele lisatud päringu täitmisplaani pilti - loetakse tabeleid Tuba ja Isik, kuid mitte Tootaja).
  • PostgreSQL 14 ei oska (vt vastusele lisatud päringu täitmisplaani pilti - loetakse nii tabeleid Tuba, Tootaja kui ka Isik).

Mida sellest järeldada.
  • Oracle oskab tabeli elimineerimist paremini kui PostgreSQL.
  • Päringu kirjutaja peab olema tähelepanelik ja ka ise päringuid lihtsustama - mitte jätma seda andmebaasisüsteemi hooleks. Andmebaasisüsteem võib kuid ei pruugi osata seda lihtsustada. Lisaks on lihtsamat koodi ka inimestel lihtsam lugeda, muuta ja sellest aru saada.

vaata ka faile:
EXPLAIN lause tulemuse näide PostgreSQLis[92 KB]
Tabeli elimineerimise teisenduse näide Oracles[85 KB]

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!