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.