(nettipäiväkirja 17.09.2014) Tietokantojenhan pitäisi olla suunniteltu tehokasta tiedon hakemista varten, vai mitä? Niissä on erikseen indeksejä joiden perusteella pystyy erityisen nopeasti etsimään juuri sellaisen tietueen, jossa tietyn kentän arvo on juuri jokin haluttu (esimerkiksi henkilön, jonka sukunimi on "Kakka"). Joskus indeksejä käytetään myös tiedon yhdistelyyn, mutta esim. LDAP-hakemistoissa oikeastaan ainoa, mitä niillä tehdään, on juuri tietyn tietueen (tai tiettyjen tietueiden) etsintä.
Siksi minua ihmetyttää asia, jonka olen usein saanut huomata käytännössä: Unixin (tai Linuxin) grep-työkalulla saa usein nopeammin haetuksi saman asian kuin tietokannasta kyselemällä. Jos siis olen tekemässä monia tietokantakyselyitä, olen usein päässyt tietokannan hidastelusta eroon tekemällä ensin tekstidumpin kaikista tietokannan tiedoista ja sitten tekemällä ihan tavallisia tekstihakuja tästä dumpista.
Miten ihmeessä tämä on mahdollista? Mille tietomäärille tyypillinen tietokantatoteutus on oikein suunniteltu? Jos esimerkiksi dumpissa oleva tietomäärä on 10-200 megatavua, grep-ratkaisu on tosi usein nopeampi (samalla koneella). Tiedän muutamia tyypillisiä syitä, miksi tietokanta saattaa skaalautua huonosti: ensinnäkin jotkin tietokannat yrittävät pitää liian paljon tietoa muistissa, jolloin tiedostoa rivi kerrallaan tutkiva grep toimii paremmin (ja jättää tilaa saman putkiston muille grepeille, samalla kun rinnakkaistuu nätisti monelle prosessorille); ja jotkin taas lähtevät oletuksesta, että vain levyhaut vievät aikaa eikä muistin sisällä tapahtuvia operaatioita edes tarvitse optimoida, koska niiden ajankäyttö on niin minimaalista levyoperaatioihin verrattuna (Postgresin dokumentaatiosta sai joskus tällaisen kuvan).