13 points par GN⁺ 2023-12-07 | 1 commentaires | Partager sur WhatsApp
  • Réécriture des fonctions JSON existantes de SQLite. Selon les cas d’usage, l’exécution peut être plusieurs fois plus rapide
  • À l’origine, les fonctions JSON opéraient en 3 étapes
    1. Analyse du JSON vers un format binaire interne plus facile à traiter pour le code C
    2. Exécution de l’opération demandée, comme rechercher un champ précis ou modifier le JSON
    3. Si l’opération a modifié le JSON, conversion du format binaire interne en chaîne JSON RFC-8279 pour l’afficher ou le stocker
  • En dehors de l’étape 2, les étapes 1 et 3 constituent un surcoût
  • SQLite utilisait une forme binaire interne du JSON contenant de nombreux pointeurs. Bien adaptée aux programmes C, mais difficile à sérialiser
  • Avec la réécriture JSONB, cette représentation binaire interne du JSON est transformée en un tableau d’octets contigu pouvant être lu ou écrit comme un BLOB SQL
  • Cela permet de stocker dans la base de données la représentation interne du JSON utilisée en interne, au lieu du texte JSON, ce qui élimine le surcoût des étapes 1 et 3

Ce qui change

  • Toutes les fonctionnalités existantes sont conservées. Seules de nouvelles capacités sont ajoutées
  • Désormais, toutes les fonctions JSON qui acceptent du texte JSON en entrée acceptent aussi le contenu binaire JSONB pour les mêmes paramètres
    • Il n’est pas nécessaire d’indiquer à la fonction si elle doit lire du texte ou des données binaires. Elle le détecte elle-même
  • Les fonctions JSON qui produisent du JSON sont maintenant proposées en deux versions
    • Les fonctions json_ existantes continuent de fonctionner comme avant
    • Des fonctions jsonb_ renvoient du JSONB au lieu de JSON texte, ce qui évite l’étape 3 dans le traitement courant
  • Sans modifier l’application, la vitesse augmente légèrement (1 %), mais tout continue de fonctionner exactement comme avant
  • En revanche, si l’application est adaptée pour stocker du JSONB au lieu de texte JSON, il est possible d’obtenir au moins un gain de performance de 3x, en particulier pour les traitements intensifs en JSON
  • De plus, comme JSONB est dans la plupart des cas légèrement plus compact que le texte JSON (environ 5 % à 10 % plus petit), les bases de données qui utilisent beaucoup de JSON peuvent aussi voir leur taille diminuer légèrement

1 commentaires

 
GN⁺ 2023-12-07
Avis Hacker News
  • Il y a beaucoup de confusion autour de JSONB.

    • JSONB est utilisé par les applications de façon très similaire au type de données JSON.
    • Les applications lisent et écrivent toujours des chaînes JSON, mais ne voient pas le contenu JSONB réel.
    • Les mêmes fonctions SQL sont disponibles avec le préfixe jsonb_.
    • Le type de données JSON est stocké sur disque en JSON, tandis que JSONB est stocké dans un format binaire spécial.
    • Le type de données JSON doit analyser l’intégralité du JSON pour effectuer des opérations, alors que JSONB peut sauter l’étape de parsing et travailler directement sur le format disque.
    • Si l’on se contente de lire et d’écrire le blob JSON entier dans SQLite, le type de données JSON convient ; mais si l’on interroge ou manipule les données avec SQL, JSONB est plus adapté.
  • JSONB est un format proposé par Postgres, recommandé car il améliore les performances de lecture par rapport au JSON classique.

  • Il a fallu des années pour comprendre l’intérêt des document stores, et ils sont excellents pour construire des POC (Proof of Concept).

    • Le renforcement du support JSON aidera SQLite à devenir un document store pertinent.
    • En sérialisant et désérialisant des messages Protobuf pour bénéficier d’un support complet des types, et en faisant de cette colonne une colonne JSONB, il devient possible de filtrer cette colonne sans devoir déplier les données recherchables dans d’autres colonnes.
  • Interrogations sur le processus de release de SQLite.

    • La dernière release est la 3.44, et JSONB est inclus dans un snapshot de pré-release.
    • On aimerait utiliser cette fonctionnalité sur D1 de Cloudflare et chez Fly.io, mais la version de SQLite n’est peut-être pas publiée ou pourrait être personnalisée.
    • Les changements d’API pourraient rompre la promesse de Cloudflare selon laquelle il serait possible d’importer des dumps/fichiers de requêtes compatibles SQLite.
  • Il est possible d’essayer JSONB dans un snapshot de pré-release ou dans le playground.

  • L’idée centrale de la spécification JSONB est que chaque élément commence par un en-tête contenant sa taille et son type.

    • Cela suggère qu’ajouter des indicateurs de taille à la spécification JSON pourrait réduire la mémoire nécessaire au traitement du JSON.
  • Familiarité avec le BSON de MongoDB, mais pas avec JSONB.

    • Voir ce billet de blog expliquant les différences entre JSONB et BSON.
  • JSONB a un impact sur les performances.

  • Il serait souhaitable d’avoir un moyen de compresser les données JSON sur plusieurs lignes.

    • Il y a des blobs très similaires sur chaque ligne, et il faudrait un moyen de réduire l’espace de stockage en gérant de nombreux blobs similaires sur plusieurs lignes.
  • Malgré le format interne, cela peut être utilisé immédiatement dans les applications.

    • Par exemple, pour les insertions en lot en Python, les appels d’insertion ligne par ligne ont un surcoût perceptible.
    • JSONB peut améliorer les performances en utilisant des CTE (Common Table Expressions).
    • json_each peut accepter des paramètres liés depuis l’application sous forme de BLOB JSONB.