V tomto článku měly být prezentovány výsledky benchmarkových testů pro objektově-relační databázi Oracle8. Bohužel jsme však pro tuto databázi žádný přijatelný benchmark nenašli. Zpočátku vypadala nadějně stránka Transaction Processing Performance Council. Zde jsou ovšem prezentovány pouze benchmarky pro relační databáze a navíc pouze jejich specifikace.
Nejnadějněji vypadal benchmark BUCKY. Je to test pro objektově-relační databáze, obsahuje kompletní dokumentaci a zdrojové texty programu pro vygenerování potřebného množství testovacích dat. Jak se ovšem ukázalo, téměř vše je (zcela správně) založeno na používání dědičnosti. Oracle verze 8.xx ovšem dědičnost ani polymorfismus neobsahuje. Tím pádem vypadla velká vetšina testovacích dotazů, které byly postaveny právě na těchto základních rysech objektového přístupu. Ty, které zůstaly, mají tak malou vypovídací schopnost, že je celý benchmark nepoužitelný. Dá se sice celý přepsat tak, aby fungoval spolehlivě pro relační schéma, ale pro objektový Oracle nefunguje.
Abychom aspoň trošku přiblížili jak BUCKY pracuje a které testy používá, je níže ve zkratce popsán návrh celé databáze a některé dotazy.
Benchmark BUCKY se skládá z objektově-relačního schématu, programu pro generování dat a kolekce dotazů pro toto schéma. Tyto dotazy testují výkon databáze v pěti oblastech:
Červené přerušované čáry označují dědičnost, ostatní černé linky reprezentují vztahy mezi instancemi typů a na každém konci jsou označeny jménem pod kterým je vztah znám. Podrobný popis jednotlivých objektů, ADT a referencí lze nalézt v dokumentaci dodávané k samotnému benchmarku.
Najdi adresy zaměstnanců s ID 6966
Dotaz v objektově-relačním SQL, který musí prohledat tabulku Employee a její
podtabulky, vypadá takto:
SELECT e.name, e.street, e.city, e.state, e.zipcode FROM Employee e WHERE e.id = 6966;V relačním SQL, kde prohledání všech těchto typů vyžaduje explicitní sjednocení všech oddělených relačních tabulek, dostáváme:
SELECT e.name, e.street, e.city, e.state, e.zipcode FROM Staff e WHERE e.id = 6966 UNION ALL SELECT e.name, e.street, e.city, e.state, e.zipcode FROM Professor e WHERE e.id = 6966 UNION ALL SELECT e.name, e.street, e.city, e.state, e.zipcode FROM TA e WHERE e.id = 6966;Tento dotaz testuje efektivnost objektově-relačního schématu zpracovávat dotazy přes hierarchii tabulek.
Najdi všechny zaměstnance, kteří vydělali víc než 96000 za rok
V O-R SQL je to čistě vypadající dotaz volající funkci salary:
SELECT e.name, e.street, e.city, e.state, e.zipcode FROM Employee e WHERE salary(e) >= 96000;V relačním SQL musí být výpočet metody přímo vložen do dotazu. To opět znamená explicitní sjednocení:
SELECT e.name, e.street, e.city, e.state, e.zipcode FROM Staff e WHERE e.annualSalary >= 96000 UNION ALL SELECT e.name, e.street, e.city, e.state, e.zipcode FROM Professor e WHERE (e.AYSalary * (9 + e.MonthSummer) / 9.0) >= 96000 UNION ALL SELECT e.name, e.street, e.city, e.state, e.zipcode FROM TA e WHERE (apptFraction * (2 * e.semesterSalary)) >= 96000;Tento dotaz testuje zacházení O-R systému s indexováním výsledků funkcí za přítomnosti hierarchie v tabulkách.
Najdi všechny zaměstnance, kteří mají dítě pojmenované "girl16."
V O-R SQL je dotaz jednoduchý pouze testuje, zda je "girl16" členem
vnořené množiny kidName:
SELECT e.name, e.street, e.city, e.state, e.zipcode FROM Staff e WHERE 'girl16' IN e.kidNames;V relačním SQL by vypadal dotaz takto:
SELECT DISTINCT e.name, e.street, e.city, e.state, e.zipcode FROM Staff e, Kids k WHERE e.id = k.id AND k.kidName = 'girl16';Tento dotaz testuje zacházení O-R systému s vnořenými množinami.
Najdi identifikátory a jména zaměstnanců, jejichž identifikátory jsou
menší než 1500 a jsou ve vzdálenosti 500 jednotek od sebe navzájem.
Nyní ukážeme složitější dotaz nad ADT. V O-R SQL vypadá takto:
SELECT s1.id, s1.name, s2.id, s2.name FROM Staff s1, Staff s2 WHERE distance(s1.place, s2.place) < 500 AND s1.id < 1500 AND s2.id < 1500 AND s1.id < s2.id;V relačním SQL by vypadal dotaz takto:
SELECT s1.id, s1.name, s2.id, s2.name FROM Staff s1, Staff s2 WHERE SQRT((s1.latitude - s2.latitude) * (s1.latitude - s2.latitude) + (s1.longitude - s2.longitude) * (s1.longitude - s2.longitude)) < 500 AND s2.id < 1500 AND s1.id < s2.id AND s1.id < 1500;
Celkem obsahuje benchmark BUCKY 17 dotazů. Jeho autoři do dokumentace přiložili i výsledky testování pro každý dotaz. Jsou uvedeny v tabulce. Obsahují naměřené doby v sekundách jak pro relační schéma, tak pro objektově-relační schéma. Všech výsledků bylo dosaženo v systému Illustra verze 3.2, nyní vlastněný firmou Informix.
Dotaz | R | O-R |
SINGLE-EXACT | 0.23 | 0.28 |
HIER-EXACT | 0.25 | 0.40 |
SINGLE-METH | 3.58 | 0.67 |
HIER-METH | 11.49 | 18.73 |
SINGLE-JOIN | 11.25 | 11.33 |
HIER-JOIN | 140.1 | 187.2 |
SET-ELEMENT | 5.8 | 23.7 |
SET-AND | 2.5 | 24.0 |
HOP-NONE | 50.9 | 95.0/39.7 |
1HOP-ONE | 0.30 | 0.29/0.26 |
1HOP-MANY | 2.32 | 23.96/6.26 |
2HOP-ONE | 4.95 | 2.12/1.74 |
ADT-SIMPLE | 5.97 | 6.43 |
ADT-COMPLEX | 9.43 | 5.92 |
ADT-SIMPLE-EXACT | 0.20 | 0.24 |
ADT-COMPLEX-RANGE | 39.6 | 22.5 |