13 pontos por GN⁺ 2023-12-07 | 1 comentários | Compartilhar no WhatsApp
  • Reescrita das funções JSON existentes do SQLite. Dependendo do padrão de uso, a execução pode ficar várias vezes mais rápida
  • Originalmente, as funções JSON operavam em 3 etapas
    1. Faziam o parse do JSON para um formato binário interno que o código em C consegue processar facilmente
    2. Executavam a operação solicitada, como localizar um campo específico ou modificar o JSON
    3. Se a operação alterasse o JSON, convertiam o formato binário interno em uma string JSON RFC-8279 para saída ou armazenamento
  • Tirando a etapa 2, as etapas 1 e 3 são overhead
  • O SQLite usava uma forma binária interna de JSON contendo muitos ponteiros. Ela se adapta bem a programas em C, mas é difícil de serializar
  • Com a reescrita do JSONB, essa representação binária interna do JSON foi alterada para um array contínuo de bytes que pode ser lido ou gravado como um SQL BLOB
  • Com isso, a representação interna do JSON usada pelo sistema pode ser armazenada no banco de dados em vez de JSON em texto, eliminando o overhead das etapas 1 e 3

O que mudou

  • Todos os recursos existentes foram mantidos. Apenas novas funcionalidades foram adicionadas
  • Agora, todas as funções JSON que aceitam texto JSON como entrada também aceitam conteúdo binário JSONB para os mesmos parâmetros
    • Não é necessário informar à função se ela deve receber texto ou dados binários. Ela detecta isso sozinha
  • Agora, as funções JSON que produzem JSON são oferecidas em duas versões
    • As funções json_ existentes continuam funcionando como antes
    • Há funções jsonb_ que retornam JSONB em vez de JSON em texto, então a etapa 3 é omitida no processamento geral
  • Se você não alterar a aplicação, tudo continuará funcionando como antes, embora com um pequeno ganho de velocidade (1%)
  • Porém, se você modificar a aplicação para começar a armazenar JSONB em vez de JSON em texto, poderá ver um ganho de desempenho de pelo menos 3x, ao menos em tarefas intensivas em JSON
  • Além disso, o JSONB costuma ser um pouco menor que o JSON em texto na maioria dos casos (cerca de 5% a 10% menor), então, se você usa muito JSON, também poderá notar uma leve redução no tamanho do banco de dados

1 comentários

 
GN⁺ 2023-12-07
Comentários do Hacker News
  • Há muita confusão sobre JSONB

    • Para a aplicação, o JSONB é usado de forma muito parecida com o tipo de dado JSON.
    • A aplicação continua lendo e gravando strings JSON, mas não vê o conteúdo real do JSONB.
    • As mesmas funções SQL podem ser usadas com o prefixo jsonb_.
    • O tipo de dado JSON é armazenado em disco como JSON, enquanto o JSONB é armazenado em um formato binário especial.
    • O tipo de dado JSON precisa fazer o parse do JSON inteiro para executar operações, enquanto o JSONB pode pular essa etapa e operar diretamente sobre o formato em disco.
    • Se você apenas lê e grava o blob JSON inteiro no SQLite, o tipo JSON é adequado, mas se consulta ou manipula os dados com SQL, o JSONB é mais apropriado.
  • JSONB é um formato oferecido pelo Postgres e geralmente recomendado por melhorar o desempenho de leitura em relação ao JSON comum.

  • Levou anos para entender o propósito de um document store, e ele é excelente para construir POCs (Proofs of Concept).

    • O fortalecimento do suporte a JSON deve ajudar a tornar o SQLite um document store adequado.
    • Ao serializar e desserializar mensagens Protobuf para ter suporte completo a tipos, se essa coluna for JSONB, será possível filtrá-la sem precisar expandir os dados pesquisáveis em outras colunas.
  • Há curiosidade sobre o processo de release do SQLite.

    • A versão mais recente é a 3.44, e o JSONB está incluído em snapshots de pré-lançamento.
    • Gostaria de usar esse recurso no D1 da Cloudflare e no Fly.io, mas a versão do SQLite pode não ter sido divulgada ou pode ser customizada.
    • Mudanças na API podem quebrar a promessa da Cloudflare de permitir importar dumps/arquivos de consulta compatíveis com SQLite.
  • É possível testar o JSONB em snapshots de pré-lançamento ou no playground.

  • A ideia central da especificação do JSONB é que cada elemento começa com um cabeçalho contendo tamanho e tipo.

    • Foi sugerido que adicionar marcadores de tamanho à especificação do JSON poderia reduzir a memória necessária para processá-lo.
  • Estou familiarizado com o BSON do MongoDB, mas não com JSONB.

    • Consulte este post de blog que explica as diferenças entre JSONB e BSON.
  • JSONB afeta o desempenho.

  • Seria bom existir uma forma de compactar dados JSON ao longo de várias linhas.

    • Há blobs muito semelhantes em cada linha, e seria necessário um jeito de reduzir o espaço de armazenamento ao guardar muitos blobs parecidos em várias linhas.
  • Apesar do formato interno, ele pode ser usado imediatamente pela aplicação.

    • Por exemplo, em inserções em lote no Python, há um overhead perceptível nas chamadas de inserção por linha.
    • O JSONB pode melhorar o desempenho usando CTEs (Common Table Expressions).
    • json_each pode aceitar parâmetros vinculados como blobs JSONB a partir da aplicação.