Veritabilele bâte de database - globale - sunt bine cunoscute de mult timp, dar până acum puțini știu să le folosească eficient sau nu le stăpânesc deloc ca pe o super-armă.
Dacă folosești globale pentru rezolvarea sarcinilor în care sunt realmente eficiente, poți obține rezultate remarcabile. Fie în performanță, fie în simplificarea soluției problemelor (, ).
Globalele sunt o metodă specială de stocare și procesare a datelor, complet diferită de tabelele din SQL. Au apărut în 1966 în limbajul (evoluția - , sau COS) în bazele de date medicale și sunt încă , dar au pătruns și în alte domenii, unde se cere fiabilitate și performanță ridicată: finanțe, trading etc.
Globalele din sistemele moderne de gestionare a bazelor de date suportă tranzacții, jurnalizare, replicare, partiționare. Adică, pe ele se pot construi sisteme moderne, fiabile, distribuite și rapide.
Globalele nu te limitează la capcanele modelului relațional. Ele oferă libertatea de a dezvolta structuri de date optimizate pentru sarcini specifice. Pentru multe aplicații, utilizarea rațională a globalelor poate fi cu adevărat o armă secretă, oferind performanța la care dezvoltatorii de aplicații relaționale pot doar să viseze.
Globalele ca metodă de stocare a datelor pot fi utilizate în multe limbaje moderne de programare, atât de nivel înalt, cât și de nivel jos. De aceea, în acest articol mă voi concentra pe globale, nu pe limbajul din care au apărut odată.
2. Cum funcționează globale
Haideți mai întâi să înțelegem cum funcționează globale și care sunt punctele lor forte. Puteți privi globalele din diferite perspective. În această parte a articolului, le vom privi ca pe niște arbori. Sau ca pe depozite de date ierarhice.
Pe scurt, o globală este un array persistent. Un array care se salvează automat pe disc.
Este greu de imaginat ceva mai simplu pentru stocarea datelor. În cod (în limbajele COS/M) se diferențiază de un array asociativ obișnuit doar prin caracterul ^ dinaintea numelui.
Pentru a salva date în globală, nu trebuie să înveți limbajul de interogare SQL, comenzile pentru lucrul cu ele sunt foarte simple. Le poți învăța într-o oră.
Să începem cu cea mai simplă exemplificare. Un arbore unilevel cu 2 ramuri. Exemplele sunt scrise în COS.

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"
Când introduci informații în global (comanda Set), se întâmplă automat 3 lucruri:
- Salvarea datelor pe disc.
- Indexarea. Ceea ce se află între paranteze este cheia (în literatura anglofonă — „subscript”), iar în dreapta semnului egal — valoarea („node value”).
- Sortarea. Datele sunt sortate după cheie. Ulterior, în timpul parcurgerii array-ului, primul element va fi „Sergey Smith”, iar al doilea „John Sidorov”. Atunci când se obține lista de utilizatori din global, baza nu pierde timp la sortare. De asemenea, se poate solicita afișarea unei liste sortate începând de la orice cheie, chiar și una inexistentă (afișarea va începe de la prima cheie reală care urmează cheii inexistente).
Toate aceste operațiuni se desfășoară incredibil de repede. Pe computerul de acasă, am obținut valori de până la 750.000 inserții/sec într-un singur proces. Pe procesoarele multicore, valorile pot atinge inserții/sec.
Desigur, viteza de inserție în sine nu spune nimic. De exemplu, poți să scrii foarte repede informațiile în fișiere text — așa că funcționează procesarea Visa. Dar în cazul globalelor, obținem un depozit structurat, indexat, cu care putem lucra simplu și rapid ulterior.

- Cea mai puternică parte a globalelor este viteza de inserție a noilor noduri.
- Datele din global sunt întotdeauna indexate. Parcurgerea lor, atât pe un singur nivel, cât și în adâncimea arborelui, este întotdeauna rapidă.
Să adăugăm în global încă câteva ramuri de nivelul doi și trei.
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 
Este evident că pe baza globalelor se pot construi arbori multilaterali. În plus, accesul la orice nod este practic instantaneu datorită autoindexării la inserție. Și la orice nivel al arborelui, toate ramurile sunt sortate după cheie.
După cum se vede, informația poate fi stocată atât în cheie, cât și în valoare. Lungimea totală a cheii (suma lungimilor tuturor indicilor) poate atinge , iar valoarea pentru Caché. Numărul de niveluri în arbore (numărul de dimensiuni) — 31.
Un alt aspect interesant. Poți construi un arbore fără a stabili valorile nodurilor de nivel înalt.

Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3 Cercul gol este un nod care nu are o valoare atribuită.
Pentru a înțelege mai bine globalele, să le comparăm cu alte tipuri de arbori: cu arborii de grădină și cu arborii din sistemele de fișiere.
Să comparăm arborii din globale cu cele mai cunoscute structuri ierarhice: arborii normali, care cresc în grădini și pe câmpuri, precum și cu sistemele de fișiere.

Așa cum vedem la arborii de grădină, frunzele și fructele se află doar la capetele ramurilor.
În sistemele de fișiere, informația este stocată doar la capetele ramurilor, care sunt numele complete ale fișierelor.
Iată structura datelor globale.
Diferențele:
- Noduri interne: Informația din global poate fi stocată în fiecare nod, nu doar la capetele ramurilor.
- Noduri externe: În global, valorile trebuie definite la capetele ramurilor, în timp ce în arborii de FS și cei de grădină, nu este necesar.
În ceea ce privește unele noduri interne, se poate spune că structura globalului este un superset al structurii arborilor de nume din sistemele de fișiere și arborii de grădină. Adică, este mai flexibilă.
În cazul general, globalul reprezintă un arbore ordonat cu posibilitatea de a stoca date în fiecare nod.
Pentru a înțelege mai bine cum funcționează globalele, să ne imaginăm ce s-ar fi întâmplat dacă creatorii sistemelor de fișiere ar fi folosit o abordare similară globalelor pentru stocarea informației.
- Când se șterge un singur fișier într-un director, directorul ar fi șters automat, precum și toate directoarele superioare care conțin doar acel director recent șters.
- Necesarul de directoare ar dispărea. Ar exista doar fișiere cu subfișiere și fișiere fără subfișiere. Dacă comparăm cu un arbore normal, fiecare ramură ar deveni un fruct.

- Lucruri precum fișierele README.txt ar putea dispărea. Tot ce trebuia spus despre conținutul unui director ar putea fi scris în fișierul directorului. În spațiul căilor, numele fișierelor nu este diferit de numele directorului, așa că s-ar putea utiliza doar fișiere.
- Viteza de ștergere a directorilor cu subdirectoare și fișiere ar crește drastic. De multe ori, pe habra, au apărut articole despre cât de mult și greu este să ștergi milioane de fișiere mici (, ). Cu toate acestea, dacă se creează un sistem de pseudo-fișiere la nivel global, acest lucru va dura secunde sau fracțiuni de secundă. Când am testat eliminarea sub-arborilor pe computerul meu de acasă, am eliminat 96-341 milioane de noduri dintr-un arbore cu două niveluri pe HDD (nu SSD) în 1 secundă. Este vorba despre eliminarea unei părți a arborelui, nu doar a întregului fișier cu globale.

Eliminarea sub-arborilor este o altă capacitate puternică a globalelor. Nu este nevoie de recursivitate pentru aceasta. Aceasta se întâmplă incredibil de repede.
În arborele nostru, acest lucru s-ar putea face cu comanda Kill.
Kill ^a("+7926X") 
Pentru o mai bună înțelegere a acțiunilor disponibile asupra globalelor, voi prezenta un tabel scurt.
Comenzi principale și funcții pentru lucrul cu globale în COS
Stabilirea ramurilor până la nod (dacă nu sunt deja definite) și a valorii nodului
Copierea sub-arborelui
Eliminarea sub-arborelui
Eliminarea valorii unui nod specific. Sub-arborele care derivă din nod nu este afectat
Parcurgerea completă a arborelui cu adâncire
Parcurgerea ramurilor unui nod specific
Verificarea dacă nodul este definit
Incrementarea atomică a valorii nodului. Pentru a nu efectua citiri și scrieri, pentru ACID. În ultima vreme, se recomandă să se schimbe în
Vă mulțumim pentru atenție, suntem gata să răspundem la întrebările dumneavoastră.
Declinarea: Această articolă și comentariile mele la aceasta reprezintă opinia mea și nu au legătură cu poziția oficială a corporației InterSystems.
Continuare . Veți descoperi ce tipuri de date pot fi afișate pe globale și în ce sarcini acestea aduc cele mai mari beneficii.
Sursa: habr.com

