Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1 As verdadeiras "espadas" dos bancos de dados — os globais — são bem conhecidas, mas ainda assim poucas pessoas sabem usá-las de forma eficiente ou não dominam esse superpoder.

Se os globais forem usados para resolver problemas em que realmente se destacam, resultados impressionantes podem ser alcançados, seja em desempenho ou na simplificação da solução do problema (1, 2).

Os globais são uma forma especial de armazenar e processar dados, completamente diferente das tabelas em SQL. Eles surgiram em 1966 na linguagem M(UMPS) (uma evolução de — Caché ObjectScript, seguido de COS) em bancos de dados médicos e até hoje são amplamente utilizados, além de terem penetrado em algumas outras áreas que exigem confiabilidade e alto desempenho: finanças, trading, etc.

Os globais em bancos de dados modernos suportam transações, log, replicação e particionamento. Ou seja, podem ser usados para construir sistemas modernos, confiáveis, distribuídos e rápidos.

Os globais não limitam você aos limites do modelo relacional. Eles oferecem liberdade para desenvolver estruturas de dados otimizadas para tarefas específicas. Para muitas aplicações, o uso inteligente de globais pode ser verdadeiramente uma arma secreta, proporcionando um desempenho que os desenvolvedores de aplicações relacionais podem apenas sonhar.

Os globais como meio de armazenamento de dados podem ser usados em muitas linguagens de programação modernas, tanto de alto nível quanto de baixo nível. Portanto, neste artigo, vou me concentrar exatamente nos globais, e não na linguagem da qual eles surgiram.

2. Como os globais funcionam

Vamos primeiro entender como os globais funcionam e quais são seus pontos fortes. Os globais podem ser vistos de várias perspectivas. Nesta parte do artigo, veremos os globais como árvores. Ou como armazenamentos hierárquicos de dados.

Simplificando, um global é um array persistente. Um array que é salvo automaticamente no disco.
É difícil imaginar algo mais simples para o armazenamento de dados. No código (em linguagens COS/M), ele se diferencia de um array associativo comum apenas pelo símbolo ^ antes do nome.

Para salvar dados em um global, não é necessário aprender a linguagem de consulta SQL; os comandos para trabalhar com eles são muito simples. Você pode aprendê-los em uma hora.

Começaremos com o exemplo mais simples. Uma árvore de um nível com 2 ramificações. Os exemplos estão escritos em COS.

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

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



Ao inserir informações no global (comando Set), três coisas acontecem automaticamente:

  1. Armazenamento de dados no disco.
  2. Indexação. O que está entre parênteses atua como chave (na literatura em inglês — "subscript"), e à direita do igual está o valor ("node value").
  3. Ordenação. Os dados são classificados pela chave. Durante a iteração do array, o primeiro elemento será "Sergey Smith" e o segundo "John Sidorov". Ao obter a lista de usuários do global, o banco de dados não perde tempo na ordenação. Além disso, é possível solicitar a saída da lista ordenada a partir de qualquer chave, mesmo que inexistente (a saída começará pela primeira chave real que segue a inexistente).

Todas essas operações ocorrem de forma incrivelmente rápida. No computador doméstico, eu recebia valores de até 750.000 inserções/segundo em um único processo. Em processadores multicores, os valores podem alcançar dezenas de milhões inserções/segundo.

Claro, a velocidade de inserção por si só não diz muito. Por exemplo, é possível gravar informações em arquivos de texto muito rapidamente — assim segundo rumores funciona o processamento da Visa. Mas no caso dos globais, obtemos um armazenamento estruturado indexado, com o qual é simples e rápido trabalhar posteriormente.

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

  • O maior trunfo dos globais é a velocidade de inserção de novos nós.
  • Os dados no global estão sempre indexados. Sua iteração pode ser rápida tanto em um nível quanto em profundidade na árvore.

Vamos adicionar ao global mais algumas ramificações de segundo e terceiro nível.

Set ^a("+7926X", "city") = "Moscovo"
Set ^a("+7926X", "city", "street") = "Praça Req"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "Londres"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

É óbvio que com base nos globais é possível construir árvores de múltiplos níveis. Além disso, o acesso a qualquer nó é praticamente instantâneo devido à autoindexação durante a inserção. E em qualquer nível da árvore, todas as ramificações estão ordenadas pela chave.

Como pode ser visto, as informações podem ser armazenadas tanto na chave quanto no valor. O comprimento total da chave (a soma dos comprimentos de todos os índices) pode alcançar 511 bytes, e os valores 3.6 MB para Caché. O número de níveis na árvore (número de dimensões) é 31.

Outro ponto interessante. É possível construir uma árvore sem definir valores para os nós dos níveis superiores.

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

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

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

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

Vamos comparar as árvores nos globais com as estruturas hierárquicas mais familiares: as árvores normais que crescem em pomares e campos, bem como os sistemas de arquivos.

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

Como podemos ver, nas árvores frutíferas, folhas e frutos estão localizados apenas nas extremidades dos galhos.
Em sistemas de arquivos, a informação é armazenada apenas nas extremidades dos galhos, que são os nomes completos dos arquivos.

Aqui está a estrutura de dados do global.

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1Diferenças:

  1. Nós internos: A informação no global pode ser armazenada em cada nó, e não apenas nas extremidades dos galhos.
  2. Nós externos: No global, os valores devem estar definidos nas extremidades dos galhos, enquanto nas árvores de sistemas de arquivos e nas frutíferas, não há essa obrigação.



Em parte dos nós internos, pode-se dizer que a estrutura do global é um superconjunto da estrutura das árvores de nomes em sistemas de arquivos e árvores frutíferas. Ou seja, é mais flexível.

De um modo geral, um global representa uma árvore ordenada com a capacidade de armazenar dados em cada nó.

Para entender melhor como os globais funcionam, vamos imaginar como seria se os criadores de sistemas de arquivos usassem uma abordagem semelhante aos globais para armazenar informações.

  1. Ao excluir um único arquivo em um diretório, o diretório seria automaticamente excluído, assim como todos os diretórios superiores que contivessem apenas o diretório recém-excluído.
  2. A necessidade de diretórios desapareceria. Haveria apenas arquivos com sub-arquivos e arquivos sem sub-arquivos. Se compararmos com uma árvore normal, cada galho se tornaria um fruto.

    Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

  3. Coisas como arquivos README.txt poderiam não existir. Tudo o que precisava ser dito sobre o conteúdo de um diretório poderia ser gravado no próprio arquivo do diretório. No espaço de nomes, o nome do arquivo é indistinguível do nome do diretório, portanto, poderíamos ter apenas arquivos.
  4. A velocidade de exclusão de diretórios com subdiretórios e arquivos aumentaria drasticamente. Muitas vezes, surgiram artigos no Habr sobre como é demorado e difícil excluir milhões de pequenos arquivos (1, 2). No entanto, se implementar um sistema de pseudo-arquivos no global, isso levaria segundos ou frações deles. Quando testei a exclusão de subárvores no meu computador pessoal, consegui excluir de 96 a 341 milhões de nós de uma árvore de dois níveis em um HDD (não SSD) em 1 segundo. E isso se refere à exclusão de uma parte da árvore, e não simplesmente de todo o arquivo com globais.

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1
A exclusão de subárvores é mais um ponto forte dos globais. Não é necessária recursão para isso. Isso acontece incrivelmente rápido.

No nossa árvore, isso poderia ser feito com o comando Kill.

Kill ^a("+7926X")

Globais – espadas-caldeirões para armazenamento de dados. Árvores. Parte 1

Para melhor compreensão das ações que temos disponíveis sobre os globais, apresento uma tabela resumida.

Principais comandos e funções para trabalhar com globais em COS

Definir
Definição de ramos até o nó (caso ainda não estejam definidos) e valor do nó

Merge
Cópia de subárvore

Kill
Exclusão de subárvore

ZKill
Exclusão do valor de um nó específico. O subárvore que sai do nó não é afetada

$Query
Percurso completo da árvore com aprofundamento

$Order
Percurso dos ramos de um nó específico

$Data
Verificação se o nó está definido

$Increment
Incrementação atômica do valor do nó. Para evitar leituras e gravações, para ACID. Ultimamente, é recomendado mudar para $Sequence

Obrigado pela atenção, estamos prontos para responder suas perguntas.

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

Continuação Globais — espadas mágicas para o armazenamento de dados. Árvores. Parte 2. Você vai descobrir quais tipos de dados podem ser exibidos nos globais e em quais tarefas eles oferecem a maior vantagem.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster