Globaler er skattesværd til lagring af data. Træer. Del 1

Globaler er skattesværd til lagring af data. Træer. Del 1 De rigtige databasesværd - globals - har længe været kendt, men stadig er det få, der ved, hvordan man bruger dem effektivt eller ejer slet ikke dette supervåben.

Hvis du bruger globaler til at løse de problemer, som de er rigtig gode til, kan du opnå fremragende resultater. Enten i produktivitet eller i forenkling af løsningen af ​​problemet (1, 2).

Globaler er en speciel måde at lagre og behandle data på, helt anderledes end tabeller i SQL. De dukkede op i 1966 på sproget M(UMPS) (evolutionær udvikling - Cache ObjectScript, herefter COS) i den medicinske database og er der stadig aktivt brugt, og trængte også ind på nogle andre områder, hvor pålidelighed og høj ydeevne er påkrævet: finans, handel osv.

Globaler i moderne DBMS'er understøtter transaktioner, logning, replikering og partitionering. De der. de kan bruges til at bygge moderne, pålidelige, distribuerede og hurtige systemer.

Globaler begrænser dig ikke til den relationelle model. De giver dig frihed til at udvikle datastrukturer, der er optimeret til specifikke opgaver. For mange applikationer kan smart brug af globaler virkelig være et hemmeligt våben, der leverer ydeevne, som relationelle applikationsudviklere kun kan drømme om.

Globaler som en måde at gemme data på kan bruges i mange moderne programmeringssprog, både på højt niveau og lavt niveau. Derfor vil jeg i denne artikel fokusere specifikt på globaler, og ikke på det sprog, de engang kom fra.

2. Hvordan globals fungerer

Lad os først forstå, hvordan globaler fungerer, og hvad deres styrker er. Globaler kan ses fra forskellige synsvinkler. I denne del af artiklen vil vi se på dem som træer. Eller som hierarkiske datavarehuse.

For at sige det enkelt, er en global en vedvarende række. Et array, der automatisk gemmes på disken.
Det er svært at forestille sig noget enklere til lagring af data. I kode (på COS/M-sprog) adskiller den sig kun fra en almindelig associativ matrix i symbolet ^ før navnet.

For at gemme data i en global, behøver du ikke at lære SQL-forespørgselssproget; kommandoerne til at arbejde med dem er meget enkle. De kan læres på en time.

Lad os starte med det enkleste eksempel. Etplanstræ med 2 grene. Eksemplerne er skrevet i COS.

Globaler er skattesværd til lagring af data. Træer. Del 1

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"



Når du indsætter information i en global (Set-kommando), sker der automatisk 3 ting:

  1. Gemmer data på disk.
  2. Indeksering. Det, der står i parentes, er nøglen (i engelsk litteratur - "subscript"), og til højre for lig er værdien ("nodeværdi").
  3. Sortering. Dataene er sorteret efter nøgle. I fremtiden, når du krydser arrayet, vil det første element være "Sergey Smith", og det andet "John Sidorov". Når du modtager en liste over brugere fra den globale, spilder databasen ikke tid på at sortere. Desuden kan du anmode om output fra en sorteret liste, startende fra en hvilken som helst nøgle, selv en ikke-eksisterende (outputtet starter fra den første rigtige nøgle, som kommer efter den ikke-eksisterende).

Alle disse operationer sker utrolig hurtigt. På min hjemmecomputer fik jeg værdier op til 750 inserts/sek i en enkelt proces. På multi-core processorer kan værdierne nå snesevis af millioner skær/sek.

Selve indsættelseshastigheden siger selvfølgelig ikke så meget. Du kan for eksempel meget hurtigt skrive information ind i tekstfiler - sådan her ifølge rygter Visumbehandling fungerer. Men i tilfælde af globals får vi som resultat et struktureret indekseret lager, som nemt og hurtigt kan arbejdes med i fremtiden.

Globaler er skattesværd til lagring af data. Træer. Del 1

  • Globals største styrke er den hastighed, hvormed nye noder kan indsættes.
  • Data i det globale indekseres altid. At krydse dem, både på ét niveau og dybt ind i træet, er altid hurtigt.

Lad os tilføje et par flere grene af andet og tredje niveau til det globale.

Set ^a("+7926X", "city") = "Moscow"
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

Globaler er skattesværd til lagring af data. Træer. Del 1

Det er indlysende, at træer på flere niveauer kan bygges baseret på globaler. Desuden er adgang til enhver node næsten øjeblikkelig på grund af automatisk indeksering under indsættelse. Og på ethvert niveau af træet er alle grene sorteret efter nøgle.

Som du kan se, kan informationer gemmes i både en nøgle og en værdi. Den samlede nøglelængde (summen af ​​længderne af alle indekser) kan nå 511 bytes, og værdierne 3.6 MB til cache. Antallet af niveauer i træet (antal dimensioner) er 31.

Endnu en interessant pointe. Du kan bygge et træ uden at angive værdierne for noderne på de øverste niveauer.

Globaler er skattesværd til lagring af data. Træer. Del 1

Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3

Tomme cirkler er noder, der ikke er tildelt nogen værdi.

For bedre at forstå globaler, lad os sammenligne dem med andre træer: havetræer og filsystemnavnetræer.

Lad os sammenligne træer på globaler med de mest kendte hierarkiske strukturer for os: med almindelige træer, der vokser i haver og marker, såvel som med filsystemer.

Globaler er skattesværd til lagring af data. Træer. Del 1

Som vi ser i havetræer, findes blade og frugter kun i enderne af grenene.
Filsystemer - information gemmes kun i enderne af filialer, som er fuldt kvalificerede filnavne.

Og her er den globale datastruktur.

Globaler er skattesværd til lagring af data. Træer. Del 1forskelle:

  1. Interne noder: information i en global kan gemmes i hver node, ikke kun i enderne af grene.
  2. Eksterne noder: Den globale skal have definerede værdier i enderne af grenene, mens FS og havetræer ikke har.



Med hensyn til interne noder kan vi sige, at strukturen af ​​det globale er et supersæt af strukturen af ​​navnetræer i filsystemer og havetræer. De der. mere fleksibel.

Generelt er det globale ordnet træ med mulighed for at gemme data i hver node.

For bedre at forstå globalts arbejde, lad os forestille os, hvad der ville ske, hvis skaberne af filsystemer brugte en tilgang svarende til globaler til at gemme information?

  1. Sletning af en enkelt fil i en mappe ville automatisk slette biblioteket, såvel som alle overliggende mapper, der kun indeholder den ene mappe, der lige er blevet slettet.
  2. Der ville ikke være behov for mapper. Der ville simpelthen være filer med underfiler og filer uden underfiler. Hvis man sammenligner med et almindeligt træ, ville hver gren blive til en frugt.

    Globaler er skattesværd til lagring af data. Træer. Del 1

  3. Ting som README.txt-filer er muligvis ikke nødvendige. Alt hvad der skulle siges om indholdet af mappen kunne skrives ind i selve mappefilen. I stirummet kan filnavnet ikke skelnes fra mappenavnet, så det var muligt at klare sig med kun filer.
  4. Hastigheden af ​​at slette mapper med indlejrede undermapper og filer ville stige dramatisk. Mange gange på Habré har der været artikler om, hvor længe og svært det er at slette millioner af små filer (1, 2). Men hvis du laver et pseudo-filsystem på et globalt, vil det tage sekunder eller brøkdele deraf. Da jeg testede at slette undertræer på en hjemmecomputer, fjernede den 1-96 millioner noder fra et to-lags træ på en HDD (ikke SSD) på 341 sekund. Desuden taler vi om at slette en del af træet, og ikke kun hele filen med globaler.

Globaler er skattesværd til lagring af data. Træer. Del 1
Fjernelse af undertræer er et andet stærkt punkt ved globals. Du behøver ikke rekursion til dette. Dette sker utrolig hurtigt.

I vores træ kunne dette gøres med kommandoen Kill.

Kill ^a("+7926X")

Globaler er skattesværd til lagring af data. Træer. Del 1

For en bedre forståelse af, hvilke handlinger der er tilgængelige for os over globale, vil jeg give en kort tabel.

Grundlæggende kommandoer og funktioner til at arbejde med globaler i COS

sæt
Indstilling af forgreninger til en node (hvis endnu ikke defineret) og nodeværdier

Flet
Kopiering af et undertræ

Kill
Fjernelse af et undertræ

ZKill
Sletning af værdien af ​​en specifik node. Undertræet, der kommer ud fra knudepunktet, berøres ikke

$Query
Fuldstændig krydsning af træet, gå dybt ind i træet

$Order
At krydse grene af en specifik knude

$Data
Kontrollerer om en node er defineret

$Inkrement
Atomisk forøgelse af en nodeværdi. For at undgå at læse og skrive, for ACID. For nylig er det blevet anbefalet at skifte til $Sekvens

Tak for din opmærksomhed, vi er klar til at besvare dine spørgsmål.

Ansvarsfraskrivelse: Denne artikel og mine kommentarer til den er min mening og har ingen relation til InterSystems Corporations officielle holdning.

Extension Globaler er skattesværd til lagring af data. Træer. Del 2. Du vil lære, hvilke typer data der kan vises på globaler, og på hvilke opgaver de giver det maksimale udbytte.

Kilde: www.habr.com

Tilføj en kommentar