Päringute optimeerimisel vaadatakse tavaliselt esimesena üle päring ise või proovitakse jõudlust parandada täiendavate indeksite abil. Enamasti on see ka loogiline koht, kust alustada. Vahel tuleb aga ette olukordi, kus päringut muuta ei saa või selle muutmine ei anna soovitud tulemust ning ka täiendavate indeksite lisamisest pole abi.
Viimase paari kuu jooksul on mul olnud paar sellist juhtumit. Mõlemal korral oli probleem sisuliselt sama: päring vajas andmete leidmiseks tabeli täielikku läbivaatamist ehk full table scan'i ning ei päringu muutmise ega täiendavate indeksitega õnnestunud selle tööd märgatavalt kiirendada.
Sellises olukorras tasub vaadata probleemi natuke teise nurga alt. Kui andmete otsimise viisi enam oluliselt parandada ei saa, võib olla võimalik vähendada andmete hulka, mille seest neid otsitakse.
Kas kõiki tabelis olevaid andmeid on tegelikult vaja?
Mõlemal minu ette tulnud juhul selgus, et tabelis hoiti oluliselt rohkem andmeid, kui päring tegelikult vajas.
Ühel juhul oli päringu jaoks vaja ainult viimase päeva seisu, kuid tabelis hoiti terve kuu andmeid. Teisel juhul vajati viimase kuu kokkuvõtet, samal ajal kui tabelisse oli kogunenud terve aasta jagu kirjeid.
See tähendab, et päring pidi iga kord läbi töötama suure hulga andmeid, mida konkreetse tulemuse saamiseks tegelikult vaja ei olnud.
Kui full table scan on vältimatu, mõjutab tabeli suurus otseselt ka seda, kui palju andmeid tuleb päringu täitmisel läbi vaadata. Seega oli antud juhul kõige mõistlikum vähendada tabelis olevate kirjete hulka.
Lahendus andmete kustutamise rotatsioonis
Mõlemal juhul piisas olemasoleva tabeli puhastustöö ehk cleanup task'i aja rotatsiooni piirangu muutmisest. Selle asemel, et hoida tabelis pikalt andmeid, mida päringud enam ei kasutanud, jäeti alles ainult tegelikult vajalik periood.
Muudatuse tulemusena eemaldati tabelist ligikaudu 90% kirjetest.
Päringut ennast ei olnud vaja muuta ja samuti ei olnud vaja lisada uusi indekseid. Kuna tabelisse jäi oluliselt vähem kirjeid, vähenes ka andmehulk, mille päring pidi tulemuse leidmiseks läbi töötama. Selle tulemusena kasvas päringu töökiirus märgatavalt.
Päringu optimeerimine ei tähenda alati päringu muutmist
See on hea näide sellest, et andmebaasi päringute optimeerimisel ei tasu vaadata ainult SQL-koodi ja indekseid. Mõnikord asub probleem hoopis andmete elutsüklis ja selles, kui palju ajaloolisi andmeid tabelisse koguneda lastakse.
Loomulikult ei saa vanu andmeid lihtsalt sellepärast kustutada, et päring kiiremini töötaks. Kõigepealt peab olema selge, milliseid andmeid süsteem, äriprotsessid, aruandlus või muud päringud tegelikult vajavad ning kui kaua neid tuleb säilitada. Kui aga selgub, et tabelis hoitakse suures mahus andmeid, mille järele enam vajadust ei ole, tasub üle vaadata andmete rotatsiooni- ja säilitusreeglid.
Eriti oluline on see tabelite puhul, kuhu tekib pidevalt uusi kirjeid. Kui vanu andmeid regulaarselt ei eemaldata, kasvab tabel aja jooksul järjest suuremaks ning päringud peavad töötama aina suurema andmehulgaga.
Põhimõte ise on väga lihtne: andmekuhjast on vajalikku infot lihtsam otsida siis, kui kuhi on väiksem.
Seega tasub olukorras, kus päringut ennast enam oluliselt optimeerida ei õnnestu, küsida veel üks küsimus: kas päring peab üldse nii suure andmehulga seest otsima?