Benchmarky


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.

 

BUCKY

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:

 

Schéma databáze BUCKY

schéma databáze

Č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.

 

Některé dotazy

HIER-EXACT: Exact-Match Over Table Hierarchy

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.

HIER-METH: Method Query Over Table Hierarchy

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.

SET-ELEMENT: Set Membership

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.

ADT-COMPLEX-RANGE: Range on Complex ADT Function

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;

 

Shrnutí

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