I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1 Le vere spade del database - le globali - sono note da tempo, ma ancora pochi sanno come usarle in modo efficace o non possiedono affatto questa super arma.

Se usi i globali per risolvere quei problemi in cui sono veramente bravi, puoi ottenere risultati eccezionali. O nella produttività o nel semplificare la soluzione del problema (1, 2).

I globali sono un modo speciale di archiviare ed elaborare i dati, completamente diverso dalle tabelle in SQL. Sono apparsi nel 1966 nella lingua PAROTITE) (sviluppo evolutivo - Memorizza ObjectScript nella cache, di seguito COS) nella banca dati medica ed è tuttora ivi presente utilizzato attivamente, e penetrato anche in altri settori dove sono richieste affidabilità e prestazioni elevate: finanza, commercio, ecc.

I globali nei moderni DBMS supportano transazioni, registrazione, replica e partizionamento. Quelli. possono essere utilizzati per costruire sistemi moderni, affidabili, distribuiti e veloci.

I globali non ti limitano al modello relazionale. Ti danno la libertà di sviluppare strutture dati ottimizzate per compiti specifici. Per molte applicazioni, l'uso intelligente dei valori globali può davvero rappresentare un'arma segreta, offrendo prestazioni che gli sviluppatori di applicazioni relazionali possono solo sognare.

I globali come metodo per archiviare i dati possono essere utilizzati in molti linguaggi di programmazione moderni, sia di alto che di basso livello. Pertanto, in questo articolo mi concentrerò specificamente sui globali e non sulla lingua da cui provenivano una volta.

2. Come funzionano i globali

Vediamo innanzitutto come funzionano le global e quali sono i loro punti di forza. I globali possono essere visti da diversi punti di vista. In questa parte dell'articolo li considereremo come alberi. O come data warehouse gerarchici.

Per dirla semplicemente, un globale è un array persistente. Un array che viene automaticamente salvato su disco.
È difficile immaginare qualcosa di più semplice per l'archiviazione dei dati. Nel codice (nei linguaggi COS/M) differisce da un normale array associativo solo nel simbolo ^ prima del nome.

Per salvare i dati in modo globale, non è necessario apprendere il linguaggio delle query SQL, i comandi per lavorare con essi sono molto semplici. Possono essere appresi in un'ora.

Cominciamo con l'esempio più semplice. Albero ad un livello con 2 rami. Gli esempi sono scritti in COS.

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

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



Quando si inseriscono informazioni in un comando globale (Set), accadono automaticamente 3 cose:

  1. Salvataggio dei dati su disco.
  2. Indicizzazione. Ciò che è tra parentesi è la chiave (nella letteratura inglese - "pedice"), e a destra di uguale c'è il valore ("valore del nodo").
  3. Ordinamento. I dati sono ordinati per chiave. In futuro, quando si attraverserà la schiera, il primo elemento sarà “Sergey Smith” e il secondo “John Sidorov”. Quando si riceve un elenco di utenti dal globale, il database non perde tempo nell'ordinamento. Inoltre è possibile richiedere l'output di una lista ordinata, a partire da qualsiasi chiave, anche inesistente (l'output inizierà dalla prima chiave reale, che viene dopo quella inesistente).

Tutte queste operazioni avvengono in modo incredibilmente veloce. Sul mio computer di casa ottenevo valori fino a 750 inserti/sec in un unico processo. Su processori multi-core i valori possono raggiungere decine di milioni inserti/sec.

Naturalmente, la velocità di inserimento in sé non dice molto. Puoi, ad esempio, scrivere molto rapidamente informazioni in file di testo, come questo dice Il trattamento dei visti funziona. Ma nel caso dei globali, otteniamo come risultato uno spazio di archiviazione indicizzato strutturato, con cui si può lavorare facilmente e rapidamente in futuro.

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

  • Il più grande punto di forza delle globali è la velocità con cui possono essere inseriti nuovi nodi.
  • I dati nel globale sono sempre indicizzati. Attraversarli, sia ad un livello che in profondità nell'albero, è sempre veloce.

Aggiungiamo qualche altro ramo del secondo e terzo livello al 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

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

È ovvio che alberi multilivello possono essere costruiti sulla base di valori globali. Inoltre, l'accesso a qualsiasi nodo è quasi istantaneo grazie all'indicizzazione automatica durante l'inserimento. E a qualsiasi livello dell'albero, tutti i rami sono ordinati per chiave.

Come puoi vedere, le informazioni possono essere archiviate sia in una chiave che in un valore. La lunghezza totale della chiave (la somma delle lunghezze di tutti gli indici) può raggiungere Byte 511e i valori 3.6 MB per la cache. Il numero di livelli nell'albero (numero di dimensioni) è 31.

Un altro punto interessante. Puoi costruire un albero senza specificare i valori dei nodi dei livelli superiori.

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

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

I cerchi vuoti sono nodi a cui non è assegnato alcun valore.

Per comprendere meglio i globali, confrontiamoli con altri alberi: alberi da giardino e alberi dei nomi del file system.

Confrontiamo gli alberi su globali con le strutture gerarchiche a noi più familiari: con alberi ordinari che crescono nei giardini e nei campi, nonché con i file system.

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

Come vediamo negli alberi da giardino, foglie e frutti si trovano solo all'estremità dei rami.
File system: le informazioni vengono archiviate solo alla fine dei rami, che sono nomi di file completi.

Ed ecco la struttura globale dei dati.

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1differenze:

  1. Nodi interni: le informazioni in un globale possono essere memorizzate in ogni nodo, non solo alle estremità dei rami.
  2. Nodi esterni: Il globale deve avere valori definiti alle estremità dei rami, mentre FS e gli alberi da giardino no.



In termini di nodi interni, possiamo dire che la struttura del globale è un superinsieme della struttura degli alberi dei nomi nei file system e negli alberi da giardino. Quelli. più flessibile.

In generale, il globale è albero ordinato con la possibilità di memorizzare dati in ciascun nodo.

Per comprendere meglio il lavoro dei globali, immagina cosa accadrebbe se i creatori dei file system utilizzassero un approccio simile ai globali per archiviare le informazioni?

  1. L'eliminazione di un singolo file in una directory eliminerebbe automaticamente la directory, così come tutte le directory sovrastanti contenenti solo quella directory appena eliminata.
  2. Non ci sarebbe bisogno di directory. Ci sarebbero semplicemente file con sottofile e file senza sottofile. Se paragonato ad un albero qualunque, ogni ramo diventerebbe un frutto.

    I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

  3. Cose come i file README.txt potrebbero non essere necessari. Tutto ciò che occorre dire sul contenuto della directory potrebbe essere scritto nel file della directory stessa. Nello spazio del percorso, il nome del file è indistinguibile dal nome della directory, quindi era possibile cavarsela solo con i file.
  4. La velocità di eliminazione delle directory con sottodirectory e file annidati aumenterebbe notevolmente. Molte volte su Habré sono stati pubblicati articoli su quanto sia lungo e difficile eliminare milioni di piccoli file (1, 2). Tuttavia, se crei uno pseudo-file system su un livello globale, ci vorranno secondi o frazioni di tempo. Quando ho testato l'eliminazione dei sottoalberi su un computer di casa, ho rimosso 1-96 milioni di nodi da un albero a due livelli su un HDD (non SSD) in 341 secondo. Inoltre, stiamo parlando di eliminare parte dell'albero e non solo l'intero file con i globali.

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1
La rimozione dei sottoalberi è un altro punto di forza dei globali. Non è necessaria la ricorsione per questo. Ciò accade in modo incredibilmente rapido.

Nel nostro albero questo potrebbe essere fatto con il comando Uccidere.

Kill ^a("+7926X")

I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 1

Per una migliore comprensione delle azioni a nostra disposizione a livello globale, fornirò una breve tabella.

Comandi e funzioni di base per lavorare con i globali in COS

Impostato
Impostazione dei rami su un nodo (se non ancora definito) e dei valori del nodo

Unire
Copia di un sottoalbero

Uccidere
Rimozione di un sottoalbero

Zuccidi
Eliminazione del valore di un nodo specifico. Il sottoalbero emergente dal nodo non viene toccato

$interrogazione
Attraversamento completo dell'albero, penetrando in profondità nell'albero

$Ordine
Attraversamento dei rami di un nodo specifico

$Dati
Verifica se un nodo è definito

$ Incremento
Incremento atomico del valore di un nodo. Per evitare di eseguire letture e scritture, per ACID. Recentemente è stato consigliato di passare a $Sequenza

Grazie per l'attenzione, siamo pronti a rispondere alle vostre domande.

Negazione di responsabilità: Questo articolo e i miei commenti rappresentano la mia opinione e non hanno alcuna relazione con la posizione ufficiale di InterSystems Corporation.

Estensione I globali sono spade del tesoro per l'archiviazione dei dati. Alberi. Parte 2. Imparerai quali tipi di dati possono essere visualizzati sui globali e su quali attività forniscono il massimo vantaggio.

Fonte: habr.com

Aggiungi un commento