Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1 As verdadeiras espadas de banco de dados - globais - são conhecidas há muito tempo, mas ainda poucos sabem como usá-las de maneira eficaz ou não possuem essa superarma.

Se você usar globais para resolver problemas nos quais eles são realmente bons, poderá obter resultados excelentes. Seja na produtividade ou na simplificação da solução do problema (1, 2).

Globais são uma forma especial de armazenar e processar dados, completamente diferente das tabelas em SQL. Eles apareceram em 1966 no idioma CAXUMBA) (desenvolvimento evolutivo - Cache ObjectScriptName, doravante COS) no banco de dados médico e ainda está lá usado ativamente, e também penetrou em algumas outras áreas onde são necessários confiabilidade e alto desempenho: finanças, comércio, etc.

Globals em DBMSs modernos suportam transações, registro, replicação e particionamento. Aqueles. eles podem ser usados ​​para construir sistemas modernos, confiáveis, distribuídos e rápidos.

Os globais não limitam você ao modelo relacional. Eles oferecem a liberdade de desenvolver estruturas de dados otimizadas para tarefas específicas. Para muitas aplicações, o uso inteligente de globais pode realmente ser uma arma secreta, proporcionando um desempenho com o qual os desenvolvedores de aplicações relacionais só podem sonhar.

Globais como forma de armazenar dados podem ser usados ​​em muitas linguagens de programação modernas, tanto de alto quanto de baixo nível. Portanto, neste artigo vou me concentrar especificamente nos globais, e não no idioma de onde eles vieram.

2. Como funcionam os globais

Vamos primeiro entender como funcionam os globais e quais são seus pontos fortes. Os globais podem ser vistos de diferentes pontos de vista. Nesta parte do artigo iremos considerá-los como árvores. Ou como data warehouses hierárquicos.

Simplificando, um global é um array persistente. Uma matriz que é salva automaticamente no disco.
É difícil imaginar algo mais simples para armazenar dados. No código (em linguagens COS/M) difere de uma matriz associativa regular apenas no símbolo ^ antes do nome.

Para salvar dados de forma global, você não precisa aprender a linguagem de consulta SQL, os comandos para trabalhar com eles são muito simples. Eles podem ser aprendidos em uma hora.

Vamos começar com o exemplo mais simples. Árvore de nível único com 2 galhos. Os exemplos estão escritos em COS.

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

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



Ao inserir informações em um global (comando Set), 3 coisas acontecem automaticamente:

  1. Salvando dados em disco.
  2. Indexação. O que está entre parênteses é a chave (na literatura inglesa - “subscrito”), e à direita de igual está o valor (“valor do nó”).
  3. Classificação. Os dados são classificados por chave. No futuro, ao percorrer o array, o primeiro elemento será “Sergey Smith” e o segundo “John Sidorov”. Ao receber uma lista de usuários do global, o banco de dados não perde tempo classificando. Além disso, você pode solicitar a saída de uma lista ordenada, começando por qualquer chave, mesmo inexistente (a saída começará a partir da primeira chave real, que vem depois da inexistente).

Todas essas operações acontecem de forma incrivelmente rápida. No meu computador doméstico eu estava obtendo valores de até 750 inserções/seg em um único processo. Em processadores multi-core os valores podem atingir dezenas de milhões inserções/seg.

Claro, a velocidade de inserção em si não diz muito. Você pode, por exemplo, gravar informações muito rapidamente em arquivos de texto - como este rumores O processamento de vistos funciona. Mas no caso de globais, obtemos como resultado um armazenamento indexado estruturado, que pode ser trabalhado de forma fácil e rápida no futuro.

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

  • A maior força dos globais é a velocidade com que novos nós podem ser inseridos.
  • Os dados no global são sempre indexados. Atravessá-los, tanto em um nível quanto profundamente na árvore, é sempre rápido.

Vamos adicionar mais algumas ramificações do segundo e terceiro níveis ao 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

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

É óbvio que árvores multiníveis podem ser construídas com base em globais. Além disso, o acesso a qualquer nó é quase instantâneo devido à indexação automática durante a inserção. E em qualquer nível da árvore, todos os ramos são classificados por chave.

Como você pode ver, as informações podem ser armazenadas tanto em uma chave quanto em um valor. O comprimento total da chave (a soma dos comprimentos de todos os índices) pode atingir Bytes 511, e os valores 3.6 MB para Cache. O número de níveis na árvore (número de dimensões) é 31.

Outro ponto interessante. Você pode construir uma árvore sem especificar os valores dos nós dos níveis superiores.

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

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

Círculos vazios são nós que não possuem nenhum valor atribuído.

Para entender melhor os globais, vamos compará-los com outras árvores: árvores de jardim e árvores de nomes de sistemas de arquivos.

Vamos comparar as árvores globais com as estruturas hierárquicas mais familiares para nós: com árvores comuns que crescem em jardins e campos, bem como com sistemas de arquivos.

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

Como vemos nas árvores de jardim, as folhas e os frutos são encontrados apenas nas pontas dos galhos.
Sistemas de arquivos - as informações são armazenadas apenas nas extremidades das ramificações, que são nomes de arquivos totalmente qualificados.

E aqui está a estrutura de dados global.

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1Diferenças:

  1. Nós internos: as informações em um global podem ser armazenadas em todos os nós, não apenas nas extremidades das ramificações.
  2. Nós externos: O global deve ter valores definidos nas extremidades dos galhos, enquanto o FS e as árvores de jardim não.



Em termos de nós internos, podemos dizer que a estrutura do global é um superconjunto da estrutura das árvores de nomes em sistemas de arquivos e árvores de jardim. Aqueles. mais flexível.

Em geral, o global é árvore ordenada com a capacidade de armazenar dados em cada nó.

Para entender melhor o trabalho dos globais, imagine o que aconteceria se os criadores dos sistemas de arquivos usassem uma abordagem semelhante aos globais para armazenar informações?

  1. Excluir um único arquivo em um diretório excluiria automaticamente o diretório, bem como todos os diretórios sobrejacentes contendo apenas o diretório recém-excluído.
  2. Não haveria necessidade de diretórios. Haveria simplesmente arquivos com subarquivos e arquivos sem subarquivos. Se comparado a uma árvore comum, cada galho se tornaria um fruto.

    Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

  3. Coisas como arquivos README.txt podem não ser necessárias. Tudo o que precisava ser dito sobre o conteúdo do diretório poderia ser escrito no próprio arquivo do diretório. No espaço do caminho, o nome do arquivo é indistinguível do nome do diretório, portanto foi possível sobreviver apenas com arquivos.
  4. A velocidade de exclusão de diretórios com subdiretórios e arquivos aninhados aumentaria dramaticamente. Muitas vezes no Habré surgiram artigos sobre como é longo e difícil excluir milhões de arquivos pequenos (1, 2). No entanto, se você criar um sistema de pseudo-arquivos global, isso levará segundos ou frações disso. Quando testei a exclusão de subárvores em um computador doméstico, ele removeu 1-96 milhões de nós de uma árvore de duas camadas em um HDD (não SSD) em 341 segundo. Além disso, estamos falando em deletar parte da árvore, e não apenas o arquivo inteiro com globais.

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1
A remoção de subárvores é outro ponto forte dos globais. Você não precisa de recursão para isso. Isso acontece incrivelmente rápido.

Na nossa árvore isso poderia ser feito com o comando Matar.

Kill ^a("+7926X")

Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 1

Para uma melhor compreensão de quais ações estão disponíveis para nós em termos globais, fornecerei uma pequena tabela.

Comandos e funções básicas para trabalhar com globais no COS

Conjunto
Configurando ramificações para um nó (se ainda não definido) e valores de nó

ir
Copiando uma subárvore

Matar
Removendo uma subárvore

ZKill
Excluindo o valor de um nó específico. A subárvore emergente do nó não é tocada

$Consulta
Percurso completo da árvore, aprofundando-se na árvore

$Pedido
Atravessando ramificações de um nó específico

$Dados
Verificando se um nó está definido

$Incremento
Incrementando atomicamente um valor de nó. Para evitar leituras e gravações, para ACID. Recentemente foi recomendado mudar para $Sequência

Obrigado pela atenção, estamos prontos para responder suas dúvidas.

Aviso Legal: Este artigo e meus comentários são minha opinião e não têm relação com a posição oficial da InterSystems Corporation.

Extensão Os globais são espadas-tesouro para armazenar dados. Árvores. Parte 2. Você aprenderá quais tipos de dados podem ser exibidos em globais e em quais tarefas eles oferecem o máximo benefício.

Fonte: habr.com

Adicionar um comentário