Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista

Funktionaalisten riippuvuuksien löytämistä datasta käytetään data-analyysin eri osa-alueilla: tietokannan hallinnassa, datan puhdistuksessa, tietokannan käänteisessä suunnittelussa ja datan tutkimisessa. Olemme jo julkaisseet tietoa riippuvuuksista itsestään. Artikkeli Anastasia Birillo ja Nikita Bobrov. Tällä kertaa Anastasia, joka valmistui tänä vuonna Tietojenkäsittelytieteen keskuksesta, kertoo tutkimusprojektinsa kehityksestä, jota hän puolusti keskuksessa.

Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista

Tehtävävalinta

Opiskellessani CS Centerissä aloin tutkia tietokantoja syvällisesti, erityisesti etsien funktionaalisia ja differentiaalisia riippuvuuksia. Tämä aihe liittyi yliopiston kurssityöhöni, joten työskennellessäni sen parissa aloin lukea artikkeleita erilaisista tietokantojen riippuvuuksista. Kirjoitin alan katsauksen – yhden ensimmäisistäni. artikkelit englanniksi ja lähetin sen SEIM-2017-konferenssiin. Olin innoissani, kun se hyväksyttiin, ja päätin perehtyä aiheeseen syvällisemmin. Käsite itsessään ei ole uusi – se on ollut olemassa 90-luvulta lähtien – mutta sitä sovelletaan edelleen monilla aloilla.

Toisella lukukaudellani keskuksessa aloitin tutkimusprojektin, jonka tavoitteena oli parantaa funktionaalisten riippuvuuksien löytämiseen tarkoitettuja algoritmeja. Työskentelin sen parissa Nikita Bobrovin, Pietarin valtionyliopiston jatko-opiskelijan, kanssa JetBrains Researchissa.

Funktionaalisten riippuvuuksien etsimisen laskennallinen monimutkaisuus

Pääongelma on laskennallinen monimutkaisuus. Mahdollisten minimaalisten ja ei-triviaalien riippuvuuksien määrää rajoittaa yllä oleva ominaisuus Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoistaMissä Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista — taulukon attribuuttien lukumäärä. Algoritmien suoritusaika riippuu paitsi attribuuttien lukumäärästä myös rivien lukumäärästä. 90-luvulla tyypillisellä pöytätietokoneella liittovaltion lain havaitsemiseen tarkoitetut algoritmit pystyivät käsittelemään jopa 20 attribuutin ja kymmeniätuhansia rivejä sisältäviä tietojoukkoja jopa useiden tuntien ajan. Nykyaikaiset moniydinprosessoreilla toimivat algoritmit havaitsevat satojen attribuuttien (jopa 200) ja satojen tuhansien rivien tietojoukkojen riippuvuuksia suunnilleen samassa ajassa. Tämä ei kuitenkaan riitä: tällainen aika on mahdotonta hyväksyä useimmissa tosielämän sovelluksissa. Siksi kehitimme lähestymistapoja olemassa olevien algoritmien nopeuttamiseksi.

Välimuistijärjestelmät osioiden leikkauspisteille

Artikkelin ensimmäisessä osassa kehitimme välimuistimenetelmiä algoritmiluokalle käyttäen osioiden leikkausmenetelmää. Attribuutin osio on joukko listoja, joissa jokainen lista sisältää rivinumerot, joilla on samat arvot tietylle attribuutille. Kutakin tällaista listaa kutsutaan klusteriksi. Monet nykyaikaiset algoritmit käyttävät osioita määrittääkseen, onko riippuvuus voimassa, eli ne noudattavat seuraavaa lemmaa: Riippuvuus Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista säilyy, jos Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista. täällä Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista Osiota merkitään symbolilla , ja käytetään osion koon käsitettä – sen sisällä olevien klustereiden lukumäärää. Osioita käyttävät algoritmit lisäävät riippuvuuden vasemmalle puolelle lisäattribuutteja, kun riippuvuus rikotaan, ja laskevat sen sitten uudelleen suorittamalla osioiden leikkausoperaation. Tätä operaatiota kutsutaan artikkeleissa erikoistumiseksi. Olemme kuitenkin huomanneet, että riippuvuuksien osioita, jotka säilyvät vasta useiden erikoistumiskierrosten jälkeen, voidaan käyttää aktiivisesti uudelleen, mikä voi merkittävästi lyhentää algoritmien suoritusaikaa, koska leikkausoperaatio on kallis.

Siksi ehdotimme heuristiikkaa, joka perustuu Shannonin entropiaan ja Gini-epävarmuuteen sekä omaan metriikkaamme, jota kutsumme käänteiseksi entropiaksi. Se on Shannonin entropian pieni muunnelma ja kasvaa aineiston ainutlaatuisuuden kasvaessa. Ehdotettu heuristiikka on seuraava:

Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista

Täällä Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista — äskettäin lasketun osion ainutlaatuisuusaste Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoistaJa Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista on yksittäisten attribuuttien ainutlaatuisuusasteiden mediaani. Kaikkia kolmea edellä kuvattua mittaria testattiin ainutlaatuisuusmittareina. Voidaan myös huomata, että heuristiikka sisältää kaksi muokkaajaa. Ensimmäinen ilmaisee, kuinka lähellä nykyinen osio on ensisijaista avainta, ja mahdollistaa kauempana kandidaattiavaimesta olevien osioiden suuremman välimuistitallennuksen. Toinen muokkaaja valvoo välimuistin käyttöastetta, kannustaen siten lisäämään välimuistiin lisää osioita, kun tilaa on saatavilla. Tämän ongelman onnistunut ratkaiseminen mahdollisti PYRO-algoritmin nopeutumisen 10–40 % tietojoukosta riippuen. On syytä huomata, että PYRO-algoritmi on tällä alueella menestynein.

Alla oleva kuva näyttää ehdotetun heuristiikan soveltamisen tulokset verrattuna kolikonheittoihin perustuvaan perusvälimuistimenetelmään. X-akseli on logaritminen.

Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista

Vaihtoehtoinen tapa tallentaa osioita

Sitten ehdotimme vaihtoehtoista menetelmää osioiden tallentamiseen. Osiot ovat joukko klustereita, joista jokainen tallentaa tuple-numeroita, joilla on identtiset arvot tietyille ominaisuuksille. Nämä klusterit voivat sisältää pitkiä tuple-numerosarjoja, esimerkiksi jos taulukon tiedot on järjestetty. Siksi ehdotimme pakkausmenetelmää osioiden tallentamiseksi, nimittäin arvojen intervallitallennusta osioklustereihin:

$$display$$pi(X) = {{underbrace{1, 2, 3, 4, 5}_{Ensimmäinen~väli}, underbrace{7, 8}_{Toinen~väli}, 10}}\ downarrow{Pakkaus}\ pi(X) = {{underbrace{$, 1, 5}_{Ensimmäinen~väli}, underbrace{7, 8}_{Toinen~väli}, 10}}$$display$$

Tämä menetelmä pystyi vähentämään muistin kulutusta TANE-algoritmin suorituksen aikana 1–25 %. TANE-algoritmi on klassinen algoritmi loogisten vyöhykkeiden etsimiseen; se käyttää osioita toimintansa aikana. Käytännön syistä TANE-algoritmi valittiin, koska intervallitallennuksen toteuttaminen oli huomattavasti helpompaa kuin esimerkiksi PYRO:ssa ehdotetun lähestymistavan toteutettavuuden arvioimiseksi. Tulokset on esitetty alla olevassa kuvassa. X-akseli on logaritminen.

Löytää tehokkaasti toiminnallisia riippuvuuksia tietokannoista

ADBIS-2019-konferenssi

Tutkimustulosten pohjalta julkaisin artikkelin syyskuussa 2019. Älykäs välimuisti tehokasta funktionaalisten riippuvuuksien etsintää varten 23. eurooppalaisessa tietokantojen ja tietojärjestelmien kehityksen konferenssissa (ADBIS-2019) työ sai tunnustusta Bernhard Thalheimilta, tietokanta-alan merkittävältä hahmolta. Tutkimustulokset muodostivat pohjan väitöskirjalleni Pietarin valtionyliopiston matematiikan ja mekaniikan tiedekunnan maisteriohjelmassa, jossa molemmat ehdotetut lähestymistavat (välimuisti ja pakkaus) toteutettiin molemmissa algoritmeissa: TANE ja PYRO. Tulokset osoittivat, että ehdotetut lähestymistavat ovat universaaleja, sillä molemmat algoritmit osoittivat merkittävää muistinkulutuksen vähenemistä ja merkittävää suoritusajan lyhenemistä.

Lähde: will.com

Lisää kommentti