Die Suche nach funktionalen AbhĂ€ngigkeiten in Daten wird in verschiedenen Analysebereichen angewendet: Datenbankmanagement, Datenbereinigung, Reverse Engineering von Datenbanken und Datenexploration. Ăber die AbhĂ€ngigkeiten selbst haben wir bereits veröffentlicht Anastasia Birillo und Nikita Bobrov. Diesmal teilt Anastasia â Absolventin des Computer Science Centers dieses Jahres â die Entwicklung ihrer Arbeit im Rahmen der Forschungsarbeit, die sie im Zentrum verteidigt hat.

Aufgabenwahl
WĂ€hrend meines Studiums im CS-Zentrum begann ich, mich intensiv mit Datenbanken zu beschĂ€ftigen, insbesondere mit der Suche nach funktionalen und differenziellen AbhĂ€ngigkeiten. Dieses Thema war mit dem Thema meiner Abschlussarbeit an der UniversitĂ€t verbunden, sodass ich beim Arbeiten an meiner Arbeit begann, Artikel zu verschiedenen AbhĂ€ngigkeiten in Datenbanken zu lesen. Ich schrieb einen Ăberblick ĂŒber dieses Gebiet â eine meiner ersten in englischer Sprache und reichte ihn fĂŒr die Konferenz SEIM-2017 ein. Ich war sehr froh, als ich erfuhr, dass er angenommen wurde, und beschloss, mich tiefer mit dem Thema zu befassen. Das Konzept selbst ist nicht neu â es wird seit den 90er Jahren angewendet, kommt aber immer noch in vielen Bereichen zur Anwendung.
Im zweiten Semester meines Studiums im Zentrum begann ich ein Forschungsprojekt zur Verbesserung der Algorithmen zur Suche nach funktionalen AbhÀngigkeiten. Ich arbeitete daran zusammen mit dem Doktoranden Nikita Bobrov von der UniversitÀt St. Petersburg basierend auf JetBrains Research.
BerechnungskomplexitÀt der Suche nach funktionalen AbhÀngigkeiten
Das Hauptproblem ist die BerechnungskomplexitÀt. Die Anzahl der möglichen minimalen und nicht-trivialen AbhÀngigkeiten ist nach oben durch den Wert begrenzt 
â die Anzahl der Attribute der Tabelle. Die Laufzeit der Algorithmen hĂ€ngt nicht nur von der Anzahl der Attribute, sondern auch von der Anzahl der Zeilen ab. In den 90er Jahren konnten Algorithmen zur Suche nach funktionalen AbhĂ€ngigkeiten auf einem normalen Desktop-PC DatensĂ€tze mit bis zu 20 Attributen und Tausenden von Zeilen in mehreren Stunden verarbeiten. Moderne Algorithmen, die auf Mehrkernprozessoren arbeiten, erkennen AbhĂ€ngigkeiten fĂŒr DatensĂ€tze mit Hunderte von Attributen (bis zu 200) und Hunderttausenden von Zeilen in etwa der gleichen Zeit. Dennoch ist das nicht ausreichend: Diese Zeit ist fĂŒr die meisten realen Anwendungen inakzeptabel. Daher haben wir AnsĂ€tze zur Beschleunigung bestehender Algorithmen entwickelt.
Caching-Modelle fĂŒr die Partitionierung
Im ersten Teil der Arbeit haben wir Caching-Schemata fĂŒr die Klasse von Algorithmen entwickelt, die das Methode des Partitionenschnitts verwenden. Eine Partition fĂŒr ein Attribut besteht aus einer Gruppe von Listen, wobei jede Liste die Zeilennummern mit denselben Werten fĂŒr dieses Attribut enthĂ€lt. Jede solche Liste wird als Cluster bezeichnet. Viele moderne Algorithmen verwenden Partitionen, um festzustellen, ob eine AbhĂ€ngigkeit gehalten wird oder nicht, und halten sich dabei an das Lemma: AbhĂ€ngigkeit
wird gehalten, wenn
. Hier wird die Partition bezeichnet und das Konzept der PartitionsgröĂe - die Anzahl der Cluster darin - verwendet. Algorithmen, die Partitionen verwenden, fĂŒgen bei Verletzung der AbhĂ€ngigkeit zusĂ€tzliche Attribute in den linken Teil der AbhĂ€ngigkeit ein und berechnen sie dann neu, indem sie den Schnitt der Partitionen durchfĂŒhren. Dieser Vorgang wird in den Artikeln als Spezialisierung bezeichnet. Wir haben jedoch festgestellt, dass Partitionen fĂŒr AbhĂ€ngigkeiten, die erst nach mehreren Runden der Spezialisierung gehalten werden, aktiv wiederverwendet werden können, was die Laufzeit der Algorithmen erheblich verkĂŒrzen kann, da der Schnitt eine kostenintensive Operation ist.
Daher haben wir eine Heuristik vorgeschlagen, die auf der Shannon-Entropie und der Ungewissheit von Genie basiert, sowie auf unserer Metrik, die wir als Umgekehrte Entropie bezeichnet haben. Sie ist eine geringfĂŒgige Modifikation der Shannon-Entropie und wĂ€chst mit zunehmender Einzigartigkeit des Datensatzes. Die vorgeschlagene Heuristik sieht wie folgt aus:
â Der Grad der Einzigartigkeit der kĂŒrzlich berechneten Partition

Hier
â Grad der Einzigartigkeit einer kĂŒrzlich berechneten Partition
, und
ist die Median der Einzigartigkeitsstufen fĂŒr einzelne Attribute. Alle drei oben beschriebenen Metriken wurden als Metrik der Einzigartigkeit getestet. Es fĂ€llt auch auf, dass die Heuristik zwei Modifikatoren enthĂ€lt. Der erste gibt an, wie nahe die aktuelle Partition am PrimĂ€rschlĂŒssel ist und ermöglicht es in gröĂerem MaĂe, diejenigen Partitionen zwischenzuspeichern, die weit vom potenziellen SchlĂŒssel entfernt sind. Der zweite Modifikator ermöglicht es, die Cache-Auslastung zu ĂŒberwachen und fördert damit die Aufnahme einer gröĂeren Anzahl von Partitionen in den Cache, wenn Platz vorhanden ist. Die erfolgreiche Lösung dieses Problems erlaubte eine Beschleunigung des PYRO-Algorithmus um 10-40 Prozent, abhĂ€ngig von dem Datensatz. Es ist erwĂ€hnenswert, dass der PYRO-Algorithmus in diesem Bereich am erfolgreichsten ist.
In der untenstehenden Abbildung sind die Ergebnisse der Anwendung der vorgeschlagenen Heuristik im Vergleich zum grundlegenden Ansatz des Cachings zu sehen, der auf dem Werfen einer MĂŒnze basiert. Die X-Achse ist logarithmisch.

Alternativer Ansatz zur Speicherung von Partitionen
Dann haben wir einen alternativen Ansatz zur Speicherung von Partitionen vorgeschlagen. Partitionen stellen eine Menge von Clustern dar, in denen die Nummern von Tuplen mit denselben Werten fĂŒr bestimmte Attribute gespeichert sind. Diese Cluster können lange Sequenzen von Tuplennummern enthalten, beispielsweise wenn die Daten in der Tabelle sortiert sind. Daher haben wir ein Kompressionsschema fĂŒr die Speicherung von Partitionen vorgeschlagen, nĂ€mlich die intervallbasierte Speicherung von Werten in den Clustern der Partitionen:
$$display$$pi(X) = {{underbrace{1, 2, 3, 4, 5}_{Erster~Intervall}, underbrace{7, 8}_{Zweiter~Intervall}, 10}}\ downarrow{Kompression}\ pi(X) = {{underbrace{$, 1, 5}_{Erster~Intervall}, underbrace{7, 8}_{Zweiter~Intervall}, 10}}$$display$$
Diese Methode konnte den Speicherverbrauch wĂ€hrend der AusfĂŒhrung des TANE-Algorithmus um 1 bis 25 % reduzieren. Der TANE-Algorithmus ist ein klassischer Algorithmus zur Suche nach funktionalen AbhĂ€ngigkeiten, der wĂ€hrend seiner AusfĂŒhrung Partitionen verwendet. Innerhalb der Praxis wurde der TANE-Algorithmus ausgewĂ€hlt, da es wesentlich einfacher war, die intervallbasierte Speicherung zu implementieren als beispielsweise im PYRO, um zu bewerten, ob der vorgeschlagene Ansatz funktioniert. Die erhaltenen Ergebnisse sind in der untenstehenden Abbildung dargestellt. Die X-Achse ist logarithmisch.

Konferenz ADBIS-2019
Im Ergebnis der Studie im September 2019 habe ich einen Artikel prĂ€sentiert Auf der 23. EuropĂ€ischen Konferenz ĂŒber Fortschritte in Datenbanken und Informationssystemen (ADBIS-2019) bemerkte Bernhard Thalheim, eine bedeutende Persönlichkeit im Bereich der Datenbanken, wĂ€hrend seiner PrĂ€sentation meine Arbeit. Die Forschungsergebnisse bildeten die Grundlage meiner Masterarbeit im Fachbereich Mathematik und Mechanik an der UniversitĂ€t St. Petersburg, im Rahmen derer beide vorgeschlagenen AnsĂ€tze (Caching und Kompression) in die beiden Algorithmen TANE und PYRO integriert wurden. Die Ergebnisse zeigten, dass die vorgeschlagenen AnsĂ€tze universell sind, da bei beiden Algorithmen und beiden AnsĂ€tzen eine signifikante Reduktion des Speicherverbrauchs sowie eine erhebliche VerkĂŒrzung der Laufzeit der Algorithmen beobachtet wurde.
Quelle: habr.com
