Hlavní navigace

Embedded databáze: Crash and Speed test db enginů (2)

30. 11. 2004
Doba čtení: 4 minuty

Sdílet

Pokračování testu sedmi vybraných embedded databázových enginů, dnes konečně dojde i na nějaká ta čísla.

Metodika vývoje testovacích programů

Testování sedmi databází vyžadovalo napsání stejného množství jednoduchých testovacích programů. Bylo by také možné napsat jen jeden program a do něj zahrnout drivery pro jednotlivé databáze. Já jsem se rozhodl pro první variantu, protože je jednodušší.

Tyto testovací programy jsou z větší části stejné, liší se jen ve způsobu komunikace s vlastní databází. Je tedy možné vzít program s rozhraním NDBM a ten pak ručně doupravit pro příslušnou databázi. Tomuto způsobu programování se říká Copy and Paste. Problém nastane, pokud budeme chtít upravit něco ve společné části kódu. Bude nutné tyto změny provést v sedmi programech ručně, což je náročné na čas programátora. Lepší je použít nějaký version control systém.

U klasických version control systémů, jako je CVS nebo Subversion, je nejlepší nahrát do vcs jen základní program a úpravy pro jednotlivé databáze provádět jen v pracovních kopiích. Změny ve společné části pak stačí zakomitovat a pracovní kopie aktualizovat, což obě verze sloučí. V těchto systémech nedoporučuji si moc hrát s vytvářením a slučováním větví. Přináší to víc starostí než užitku.

Já jsem se rozhodl pro použití version control systému GNU Arch, který podobně jako BitKeeper nebo Darcs umožňuje velice pohodlné slučování změn (a to i obousměrné) mezi jednotlivými větvemi.

Test č. 1

Začneme čím jiným než vytvořením databáze. Budeme vkládat 70 tisíc záznamů o délce klíče 4 bajty a délce záznamu 40 bajtů, celem 3080000 bajtů dat. Kromě rychlosti budeme měřit i overhead způsobený řídícími záznamy databáze. Test byl prováděn 3×, vzal jsem nejlepší výsledek, což zmenší chybu měření.

Většina databází umožňuje při vytváření databáze použít uživatelem definovanou velikost stránky místo defaultní, která je obvykle jen 512 bajtů. Některé databáze umožňují také vypnout zamykání. Pokud jsou tyto volby možné, najdete databázi ve výsledcích dvakrát. Jednou s defaultním nastavením a podruhé s 4KB stránkou a bez zámků. Pod označením ndbm se skrývá db1 s tuningem, jenž se použije při přístupu pomocí ndbm api, které tuning db enginu standardně neumožňuje.

Tabulka č. 611
databáze čas sec. velikost souboru B overhead velikosti databáze
ndbm 16.841 7008256 2.27
db1 16.736 5005312 1.62
db1 def 40.999 4997120 1.62
db4 def 84.96 5160960 1.67
db4  — deadlock  —
gdbm 28.149 7024640 2.28
gdbm def 36.480 6865776 2.22
qdbm 16.271 5058460 1.64
qdbm def 14.922 5072812 1.65
tdb 7.263 5070848 1.65
tdbm def 50.300 5054464 1.64
cdb 0.652 4762048 1.55
puredb 1.469 4201032 1.36

Databáze DB4.1 nebyla schopna test s 4K blokem dokončit, neboť skončila deadlockem sama se sebou. Podobné výkony vidíme i v operačních systémech Win 95/8, kde není neobvyklým jevem zařízení, které je v konfliktu samo se sebou.

Výsledky testu

Nejrychleji umějí vytvářet databázi tzv. konstatní databáze. V našem testu jsou zastoupeny cdb a puredb. U tdb databáze s vypnutým zamykáním můžeme hezky vidět, jak použití mmapu zefektivní výsledný program. QDBM byla jediná databáze s tak dobře nastavenými defaulty, že dosáhla s 4K stránkou horšího výsledku. Za zmínku stojí i fakt, že pokud k db1 přistupujete přes db1 native api, jsou db1 defaulty nastaveny velmi špatně. Komerční vývojáře jistě potěší fakt, že nejrychlejší databáze jsou jim licenčně nakloněny. Tdb s mmapem je mimo hru, neb OS WinDos stejně není mmapem podporován. Dále vidíme, že data po vložení do databáze nabobtnají zhruba v poměru 1.6; u SQL databázových serverů je tento poměr trošku vyšší – zhruba 2.1.

Test č. 2

V dalším testu budeme všecha uložená data přepisovat, a to hned třikrát. Poprvé přepíšeme data jinými o stejné délce. V ideálním případě bychom neměli pozorovat žádný nárůst velikosti db a tato operace by měla být z přepisových operací nejrychlejší.

Tabulka č. 612
databáze čas velikost souboru změna velikosti
ndbm 23.477 7008256 0
db1 16.031 5005312 0
db1 default 38.720 4997120 0
db4 default 72.59 5160960 0
gdbm 33.356 7024640 0
gdbm default 39.504 6865776 0
qdbm 18.131 5058460 0
qdbm default 16.459 5072812 0
tdb 3.219 5070848 0
tdb default 22.582 5054464 0
cdb 0.652 4762048 0
puredb 1.469 4201032 0

Přepis všech původních dat daty o poloviční délce. Tato operace by měla být pro databázi náročnější, neboť je potřeba přidat uvolněné místo do free listu. Zdaleka ne všechny databáze to však dělají, některé na to kašlou, a tak, pokud přepíšete záznam záznamem o kratší délce, zbylé volné místo zůstane již dále nevyužito. Také by se mohl celkový soubor zmenšit – to však nedělá žádná mně známá databáze.

Tabulka č. 613
databáze čas velikost souboru změna velikosti
ndbm 23.752 7008256 0
db1 15.569 5005312 0
db1 default 37.056 4997120 0
db4 default 72.37 5160960 0
gdbm 36.635 7024640 0
gdbm default 42.667 7708668 0
qdbm 17.802 5058460 0
qdbm default 16.805 5072812 0
tdb 3.771 5070848 0
tdb default 22.950 5054464 0
cdb 0.482 3362048  –29 %
puredb 1.102 2801032  –33 %

Výsledky tohoto testu ukázaly, že přepis kratšími daty databázi znatelněji nezatěžuje. Výsledná velikost souboru se snížila jen u konstatních databází. Tyto databáze neumějí soubor s daty aktualizovat – místo aktualizace ho znovu vytvoří, tuto operaci zvládají mnohem rychleji než klasické databáze.

CS24_early

Přepis všech záznamů daty o dvojnásobné velikosti. Zde bych za nejzajímavější údaj označil změnu výsledné velikosti souboru.

Tabulka č. 614
databáze čas velikost souboru nárůst velikosti v %
ndbm 30.979 8908800 27
db1 36.584 10358784 106
db1 default 74.94 10108928 102
db4 default 2:55.35 10502144 103
gdbm 43.174 13082708 86
gdbm default 51.077 13197392 71
qdbm 25.690 12898460 154
qdbm default 24.411 12912812 154
tdb 17.939 8986624 77
tdb default 2:24.62 8970240 77
cdb 1.126 7562048 58
puredb 2.183 7001032 66

V závěrečném dílu se podíváme na rychlost čtení a na práci s poškozenými datovými soubory.

Byl pro vás článek přínosný?

Autor článku