ProHoster > Blog > uprava > Globali su mačevi za pohranjivanje podataka. Drveće. 1. dio
Globali su mačevi za pohranjivanje podataka. Drveće. 1. dio
Pravi mačevi baze podataka - globali - odavno su poznati, no još uvijek ih malo tko zna učinkovito koristiti ili uopće ne posjeduje ovo superoružje.
Ako koristite globale u rješavanju onih problema u kojima su oni stvarno dobri, možete postići izvanredne rezultate. Bilo u produktivnosti ili u pojednostavljenju rješenja problema (1, 2).
Globali su poseban način pohranjivanja i obrade podataka, potpuno drugačiji od tablica u SQL-u. Pojavile su se 1966. u jeziku ZAUŠNJACI) (evolucijski razvoj - Predmemorirajte ObjectScript, u daljnjem tekstu COS) u medicinskoj bazi podataka i još uvijek je tamo aktivno korišten, a prodrli su i u neka druga područja gdje se zahtijevaju pouzdanost i visoke performanse: financije, trgovina itd.
Globali u modernim DBMS-ovima podržavaju transakcije, zapisivanje, replikaciju i particioniranje. Oni. mogu se koristiti za izgradnju modernih, pouzdanih, distribuiranih i brzih sustava.
Globali vas ne ograničavaju na relacijski model. Daju vam slobodu da razvijete strukture podataka koje su optimizirane za specifične zadatke. Za mnoge aplikacije, pametno korištenje globala doista može biti tajno oružje, pružajući performanse o kojima razvijači relacijskih aplikacija mogu samo sanjati.
Globali kao način pohranjivanja podataka mogu se koristiti u mnogim modernim programskim jezicima, kako na visokoj tako i na niskoj razini. Stoga ću se u ovom članku fokusirati upravo na globale, a ne na jezik iz kojeg su nekada dolazile.
2. Kako funkcioniraju globali
Prvo shvatimo kako globali funkcioniraju i koje su njihove prednosti. Na globale se može gledati s različitih stajališta. U ovom dijelu članka promatrat ćemo ih kao stabla. Ili poput hijerarhijskih skladišta podataka.
Pojednostavljeno rečeno, global je trajni niz. Niz koji se automatski sprema na disk.
Teško je zamisliti nešto jednostavnije za pohranu podataka. U kodu (u COS/M jezicima) razlikuje se od običnog asocijativnog niza samo u simbolu ^ prije imena.
Za spremanje podataka u globalu ne morate učiti jezik SQL upita, naredbe za rad s njima vrlo su jednostavne. Mogu se naučiti za sat vremena.
Počnimo s najjednostavnijim primjerom. Drvo na jednoj razini s 2 grane. Primjeri su napisani u COS-u.
Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"
Prilikom umetanja informacija u global (naredba Set), automatski se događaju 3 stvari:
Spremanje podataka na disk.
Indeksiranje. Ono što je u zagradama je ključ (u engleskoj literaturi - “subscript”), a desno od jednakosti je vrijednost (“node value”).
Sortiranje. Podaci su poredani po ključu. Ubuduće, pri prelasku niza, prvi element će biti "Sergey Smith", a drugi "John Sidorov". Kada prima popis korisnika iz globala, baza podataka ne gubi vrijeme na sortiranje. Štoviše, možete zatražiti izlaz sortirane liste, počevši od bilo kojeg ključa, čak i nepostojećeg (izlaz će započeti od prvog stvarnog ključa, koji dolazi nakon nepostojećeg).
Sve te operacije odvijaju se nevjerojatno brzo. Na svom kućnom računalu dobivao sam vrijednosti do 750 000 umetanja/s u jednom procesu. Na višejezgrenim procesorima vrijednosti mogu doseći desetke milijuna umetaka/sek.
Naravno, sama brzina umetanja ne govori puno. Možete, na primjer, vrlo brzo zapisati informacije u tekstualne datoteke - ovako šuškalo se Radovi na obradi viza. Ali u slučaju globala, kao rezultat dobivamo strukturiranu indeksiranu pohranu s kojom se u budućnosti može lako i brzo raditi.
Najveća snaga globala je brzina kojom se mogu umetnuti novi čvorovi.
Podaci u globalu uvijek su indeksirani. Prelaženje njima, i na jednoj razini i duboko u stablo, uvijek je brzo.
Dodajmo još nekoliko grana druge i treće razine u global.
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
Očito je da se višerazinska stabla mogu graditi na temelju globala. Štoviše, pristup bilo kojem čvoru je gotovo trenutan zbog automatskog indeksiranja tijekom umetanja. I na bilo kojoj razini stabla, sve su grane poredane po ključu.
Kao što vidite, informacije se mogu pohraniti iu ključu iu vrijednosti. Ukupna duljina ključa (zbroj duljina svih indeksa) može doseći 511 bajtova, i vrijednosti 3.6 MB za Cache. Broj razina u stablu (broj dimenzija) je 31.
Još jedna zanimljiva točka. Možete izgraditi stablo bez navođenja vrijednosti čvorova gornjih razina.
Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3
Prazni krugovi su čvorovi kojima nije dodijeljena vrijednost.
Kako bismo bolje razumjeli globale, usporedimo ih s drugim stablima: vrtnim stablima i stablima naziva datotečnog sustava.
Usporedimo stabla na globalima s nama najpoznatijim hijerarhijskim strukturama: s običnim stablima koja rastu u vrtovima i poljima, kao i sa sustavima datoteka.
Kao što vidimo kod vrtnog drveća, lišće i plodovi nalaze se samo na krajevima grana.
Datotečni sustavi - informacije se pohranjuju samo na krajevima grana, što su potpuno kvalificirani nazivi datoteka.
I ovdje je globalna struktura podataka.
razlike:
Unutarnji čvorovi: informacije u globalu mogu biti pohranjene u svakom čvoru, a ne samo na krajevima grana.
Vanjski čvorovi: Global mora imati definirane vrijednosti na krajevima grana, dok FS i vrtna stabla nemaju.
Što se tiče internih čvorova, možemo reći da je struktura globala nadskup strukture stabala imena u sustavima datoteka i vrtnih stabala. Oni. fleksibilniji.
Općenito, globalno je uređeno stablo s mogućnošću pohranjivanja podataka u svakom čvoru.
Da bismo bolje razumjeli rad globala, zamislimo što bi se dogodilo da kreatori datotečnih sustava koriste pristup sličan globalima za pohranu informacija?
Brisanje jedne datoteke u direktoriju automatski bi izbrisalo direktorij, kao i sve nadređene direktorije koji sadrže samo jedan upravo izbrisani direktorij.
Ne bi bilo potrebe za imenicima. Jednostavno bi postojale datoteke s poddatotekama i datoteke bez poddatoteka. Ako se usporedi s običnim stablom, onda bi svaka grana postala plod.
Stvari poput datoteka README.txt možda neće biti potrebne. Sve što je trebalo reći o sadržaju imenika moglo se upisati u samu datoteku imenika. U prostoru staze, naziv datoteke se ne razlikuje od naziva direktorija, tako da je bilo moguće proći samo s datotekama.
Brzina brisanja direktorija s ugniježđenim poddirektorijima i datotekama dramatično bi se povećala. Mnogo je puta na Habréu bilo članaka o tome koliko je dugo i teško brisati milijune malih datoteka (1, 2). Međutim, ako napravite pseudo-datotečni sustav na globalu, to će trajati nekoliko sekundi ili djeliće. Kad sam testirao brisanje podstabala na kućnom računalu, uklonilo je 1-96 milijuna čvorova iz dvoslojnog stabla na HDD (ne SSD) u 341 sekundi. Štoviše, govorimo o brisanju dijela stabla, a ne samo cijele datoteke s globalima.
Uklanjanje podstabala je još jedna jaka strana globala. Za ovo vam ne treba rekurzija. To se događa nevjerojatno brzo.
U našem stablu to se može učiniti pomoću naredbe Ubiti.
Kill ^a("+7926X")
Za bolje razumijevanje koje su nam radnje dostupne preko globala, dat ću kratku tablicu.
Osnovne naredbe i funkcije za rad s globalima u COS-u
Postaviti
Postavljanje grana na čvor (ako još nije definirano) i vrijednosti čvora
$Prirast
Atomsko povećanje vrijednosti čvora. Kako bi se izbjeglo čitanje i pisanje, za ACID. Nedavno je preporučeno promijeniti u $Sequence
Hvala vam na pažnji, spremni smo odgovoriti na vaša pitanja.
Izjava o odricanju od odgovornosti: Ovaj članak i moji komentari na njega moje su mišljenje i nemaju nikakve veze sa službenim stavom InterSystems Corporation.