Echte Datenbank-Merge, Globals, sind schon lange bekannt, aber bisher können nur wenige sie effektiv nutzen oder besitzen dieses Superwerkzeug ĂŒberhaupt nicht.
Wenn Sie Globals fĂŒr die Aufgaben verwenden, bei denen sie wirklich gut sind, können Sie herausragende Ergebnisse erzielen. Entweder in der Leistung oder in der Vereinfachung der Lösung der Aufgabe (, ).
Globals sind eine spezielle Methode zur Speicherung und Verarbeitung von Daten, ganz anders als Tabellen in SQL. Sie erschienen 1966 in der Sprache (evolutionÀre Entwicklung - , auch bekannt als COS) in medizinischen Datenbanken und werden bis heute dort , haben sich aber auch in andere Bereiche verbreitet, in denen ZuverlÀssigkeit und hohe Leistung gefordert sind: Finanzen, Trading usw.
Globals in modernen DBMS unterstĂŒtzen Transaktionen, Protokollierung, Replikation, Partitionierung. Das heiĂt, auf ihnen können moderne, zuverlĂ€ssige, verteilte und schnelle Systeme aufgebaut werden.
Globals schrĂ€nken Sie nicht auf die Grenzen des relationalen Modells ein. Sie geben Freiraum fĂŒr die Entwicklung von Datenstrukturen, die auf spezifische Aufgaben optimiert sind. FĂŒr viele Anwendungen kann die sinnvolle Nutzung von Globals wirklich eine geheime Waffe sein, die eine Leistung bietet, von der Entwickler relationaler Anwendungen nur trĂ€umen können.
Globals als Methode zur Datenspeicherung können in vielen modernen Programmiersprachen verwendet werden, sowohl in Hoch- als auch in Niedrigsprachen. Daher werde ich mich in diesem Artikel genau auf Globals konzentrieren und nicht auf die Sprache, aus der sie einst hervorgingen.
2. Wie Globals funktionieren
Lassen Sie uns zunÀchst verstehen, wie Globals funktionieren und wo ihre StÀrken liegen. Globals können aus verschiedenen Perspektiven betrachtet werden. In diesem Teil des Artikels werden wir sie als BÀume betrachten. Oder als hierarchische Datenspeicher.
Einfach ausgedrĂŒckt ist ein Global ein persistentes Array. Ein Array, das automatisch auf der Festplatte gespeichert wird.
Es ist schwer, sich etwas Einfacheres zur Speicherung von Daten vorzustellen. Im Code (in den Sprachen COS/M) unterscheidet es sich nur durch das Symbol ^ vor dem Namen.
Um Daten im Globalen zu speichern, muss man keine SQL-Abfragesprache lernen; die Befehle zu ihrer Handhabung sind sehr einfach. Man kann sie in einer Stunde lernen.
Lass uns mit dem einfachsten Beispiel beginnen. Ein einstufiger Baum mit 2 Ăsten. Die Beispiele sind in COS geschrieben.

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"
Beim EinfĂŒgen von Informationen in das Globale (Befehl Set) passieren automatisch 3 Dinge:
- Speichern der Daten auf der Festplatte.
- Indizierung. Das, was in der Klammer steht, fungiert als SchlĂŒssel (in der englischen Literatur â âsubscriptâ), und rechts vom Gleichheitszeichen steht der Wert (ânode valueâ).
- Sortierung. Die Daten werden nach dem SchlĂŒssel sortiert. Bei einer Traversierung des Arrays wird das erste Element "Sergey Smith" und das zweite "John Sidorov" sein. Beim Abrufen der Benutzerliste aus dem Globalen benötigt die Datenbank keine Zeit fĂŒr die Sortierung. AuĂerdem kann man eine sortierte Liste abgerufen werden, beginnend mit jedem SchlĂŒssel, selbst mit nicht existierenden (die Ausgabe beginnt mit dem ersten tatsĂ€chlichen SchlĂŒssel, der nach dem nicht existierenden kommt).
All diese Operationen geschehen unglaublich schnell. An meinem Heimcomputer erreichte ich Werte von bis zu 750.000 EinfĂŒgungen/Sekunde in einem einzigen Prozess. Auf Mehrkernprozessoren können die Werte sogar erreichen EinfĂŒgungen/Sekunde.
NatĂŒrlich sagt die Geschwindigkeit des EinfĂŒgens alleine wenig aus. Man kann zum Beispiel sehr schnell Informationen in Textdateien schreiben â so bei der Verarbeitung von Visa funktionieren. Aber im Fall der Globals erhalten wir ein strukturiertes, indiziertes Speicherformat, mit dem man anschlieĂend einfach und schnell arbeiten kann.

- Die gröĂte StĂ€rke der Globals ist die Geschwindigkeit des EinfĂŒgens neuer Knoten.
- Die Daten im Globalen sind immer indiziert. Ihre Traversierung sowohl auf einer Ebene als auch in die Tiefe des Baumes erfolgt immer schnell.
Lass uns dem Globalen noch einige Zweige der zweiten und dritten Ebene hinzufĂŒgen.
Set ^a("+7926X", "city") = "Moskau"
Set ^a("+7926X", "city", "street") = "Req Square"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "London"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36 
Es ist offensichtlich, dass auf der Basis von Globals mehrstufige BĂ€ume aufgebaut werden können. Der Zugriff auf jeden Knoten erfolgt nahezu augenblicklich aufgrund der automatischen Indizierung beim EinfĂŒgen. Und auf jeder Ebene des Baumes sind alle Ăste nach dem SchlĂŒssel sortiert.
Wie man sieht, kann die Information sowohl im SchlĂŒssel als auch im Wert gespeichert werden. Die gesamte LĂ€nge des SchlĂŒssels (Summe der LĂ€ngen aller Indizes) kann bis zu , und die Werte fĂŒr CachĂ©. Die Anzahl der Ebenen im Baum (Anzahl der Dimensionen) â 31.
Ein weiterer interessanter Punkt. Es ist möglich, einen Baum zu erstellen, ohne Werte fĂŒr die Knoten der oberen Ebenen festzulegen.

Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3 Leere Kreise sind Knoten, denen kein Wert zugewiesen ist.
Um Globals besser zu verstehen, vergleichen wir sie mit anderen BÀumen: mit GartenbÀumen und mit den BÀumen von Dateisystemen.
Vergleichen wir die BĂ€ume in Globals mit den uns am vertrautesten hierarchischen Strukturen: mit normalen BĂ€umen, die in GĂ€rten und Feldern wachsen, sowie mit Dateisystemen.

Wie wir bei GartenbĂ€umen sehen, befinden sich die BlĂ€tter und FrĂŒchte nur an den Enden der Ăste.
In Dateisystemen wird die Information nur an den Enden der Ăste gespeichert, die die vollstĂ€ndigen Dateinamen sind.
Hier ist die Datenstruktur eines Globals.
Unterschiede:
- Innere Knoten: Informationen in Globals können in jedem Knoten gespeichert werden, nicht nur an den Enden der Ăste.
- ĂuĂere Knoten: In Globals mĂŒssen an den Enden der Ăste Werte definiert sein, in FS-BĂ€umen und GartenbĂ€umen hingegen nicht.
In Bezug auf einige innere Knoten kann man sagen, dass die Struktur eines Globals eine Ăbermenge der Struktur von NamensbĂ€umen in Dateisystemen und GartenbĂ€umen ist. Das heiĂt, sie ist flexibler.
Im Allgemeinen stellt ein Global dar einen geordneten Baum mit der Möglichkeit, Daten in jedem Knoten zu speichern..
Um die Funktionsweise von Globals besser zu verstehen, stellen wir uns vor, was wÀre, wenn die Ersteller von Dateisystemen einen Ansatz Àhnlich dem der Globals zur Speicherung von Informationen verwendet hÀtten?
- Beim Löschen einer einzelnen Datei im Verzeichnis wĂŒrde automatisch das Verzeichnis sowie alle ĂŒbergeordneten Verzeichnisse gelöscht werden, die nur dieses kĂŒrzlich gelöschte Verzeichnis enthalten.
- Die Notwendigkeit fĂŒr Verzeichnisse wĂ€re entfallen. Es wĂ€ren einfach Dateien mit Unterdateien und Dateien ohne Unterdateien vorhanden. Im Vergleich zu einem normalen Baum wĂŒrde jeder Ast zu einer Frucht werden.

- Sowas wie die Datei README.txt wĂ€re möglicherweise entfallen. Alles, was man ĂŒber den Inhalt eines Verzeichnisses sagen mĂŒsste, könnte in die Datei des Verzeichnisses selbst geschrieben werden. Im Pfadraum wĂ€re der Dateiname nicht von dem Verzeichnisnamen zu unterscheiden, daher könnte man sich mit nur Dateien begnĂŒgen.
- Die Geschwindigkeit beim Löschen von Verzeichnissen mit verschachtelten Unterverzeichnissen und Dateien wĂŒrde erheblich steigen. In der Vergangenheit gab es viele Artikel ĂŒber die lange und schwierige Aufgabe, Millionen kleiner Dateien zu löschen., ). Allerdings wĂŒrden ein Pseudo-Dateisystem auf Globalen Sekunden oder deren Bruchteile benötigen. Als ich das Entfernen von TeilbĂ€umen auf meinem Heimcomputer testete, wurden in einer Sekunde 96-341 Millionen Knoten aus einem zweistufigen Baum auf einer HDD (nicht SSD) gelöscht. Dabei geht es um das Entfernen eines Teils des Baums und nicht einfach um die gesamte Datei mit den Globalen.

Das Entfernen von TeilbĂ€umen ist eine weitere StĂ€rke von Globalen. DafĂŒr ist keine Rekursion erforderlich. Dies geschieht unglaublich schnell.
In unserem Baum könnte dies mit dem Befehl Kill.
Kill ^a("+7926X") 
Um besser zu verstehen, welche Aktionen uns mit den Globalen zur VerfĂŒgung stehen, gebe ich eine kurze Tabelle an.
Hauptbefehle und Funktionen zur Arbeit mit Globalen in COS
Setzen von Zweigen bis zum Knoten (wenn sie noch nicht definiert sind) und den Wert des Knotens
Kopieren eines Teilbaums
Löschen eines Teilbaums
Löschen des Wertes eines bestimmten Knotens. Der Teilbaum, der aus dem Knoten hervorgeht, bleibt unberĂŒhrt
VollstÀndige Durchquerung des Baumes mit Vertiefung
Durchqueren der Ăste eines bestimmten Knotens
ĂberprĂŒfen, ob der Knoten definiert ist
Atomares Inkrementieren des Wertes eines Knotens. Um Lese- und SchreibvorgĂ€nge zu vermeiden, fĂŒr ACID. In letzter Zeit wird empfohlen, zu wechseln zu
Vielen Dank fĂŒr Ihre Aufmerksamkeit, wir sind bereit, Ihre Fragen zu beantworten.
Haftungsausschluss: Dieser Artikel und meine Kommentare dazu sind meine persönliche Meinung und stehen nicht im Zusammenhang mit der offiziellen Position der InterSystems Corporation.
Fortsetzung . Sie erfahren, welche Datentypen auf Globalen dargestellt werden können und bei welchen Aufgaben sie den gröĂten Gewinn bringen.
Quelle: habr.com

