13 puntos por GN⁺ 2023-12-07 | 1 comentarios | Compartir por WhatsApp
  • Se reescribieron las funciones JSON existentes de SQLite. Dependiendo del patrón de uso, pueden ejecutarse varias veces más rápido
  • Las funciones JSON originales operaban en 3 etapas
    1. Parsear el JSON a un formato binario interno que el código en C pueda procesar fácilmente
    2. Realizar la operación solicitada, como buscar un campo específico o modificar el JSON
    3. Si la operación modificó el JSON, convertir el formato binario interno a una cadena JSON RFC-8279 para su salida o almacenamiento
  • Fuera de la etapa 2, las etapas 1 y 3 son sobrecarga
  • SQLite usaba una forma binaria interna de JSON que incluye muchos punteros. Encaja bien con programas en C, pero es difícil de serializar
  • Mediante la reescritura de JSONB, esta representación binaria interna del JSON se cambió a un arreglo continuo de bytes que puede leerse o escribirse como un SQL BLOB
  • Esto permite almacenar en la base de datos la representación interna del JSON que usa SQLite, en lugar de texto JSON, eliminando así la sobrecarga de las etapas 1 y 3

Qué cambió

  • Toda la funcionalidad existente se mantiene igual. Solo se agregaron nuevas funciones
  • Ahora, todas las funciones JSON que aceptan texto JSON como entrada también aceptan contenido binario JSONB con los mismos parámetros
    • No hace falta indicarle a la función si recibirá texto o datos binarios. La función lo determina por sí sola
  • Ahora, las funciones JSON que generan salida se ofrecen en dos versiones
    • Las funciones existentes json_ siguen funcionando igual que antes
    • Existen funciones jsonb_ que devuelven JSONB en lugar de JSON de texto, por lo que en el procesamiento normal se omite la etapa 3
  • Si no cambias la aplicación, la velocidad mejora un poco (1%), pero todo seguirá funcionando exactamente igual que antes
  • Sin embargo, si modificas la aplicación para empezar a almacenar JSONB en lugar de texto JSON, podrías ver una mejora de rendimiento de al menos 3 veces en tareas intensivas en JSON
  • Además, JSONB suele ser un poco más pequeño que el texto JSON en la mayoría de los casos (alrededor de 5% a 10% menos), así que si usas mucho JSON, también podrías notar una ligera reducción en el tamaño de la base de datos

1 comentarios

 
GN⁺ 2023-12-07
Comentarios en Hacker News
  • Hay mucha confusión sobre JSONB

    • JSONB se usa en las aplicaciones de forma muy similar al tipo de dato JSON.
    • La aplicación sigue leyendo y escribiendo cadenas JSON, pero no ve el contenido real de JSONB.
    • Las mismas funciones SQL pueden usarse con el prefijo jsonb_.
    • El tipo de dato JSON se guarda en disco como JSON, pero JSONB se guarda en un formato binario especial.
    • El tipo de dato JSON tiene que parsear todo el JSON para realizar operaciones, pero JSONB puede saltarse esa etapa y operar directamente sobre el formato en disco.
    • Si simplemente lees y escribes el blob JSON completo en SQLite, el tipo de dato JSON es adecuado, pero si consultas o manipulas los datos con SQL, JSONB es más apropiado.
  • JSONB es un formato que ofrece Postgres, y se recomienda porque mejora el rendimiento de lectura frente al JSON normal.

  • Tomó varios años entender el propósito de los document stores, y son excelentes para construir POC (Proof of Concept).

    • Reforzar el soporte de JSON ayudará a que SQLite sea un document store adecuado.
    • Si serializas y deserializas mensajes Protobuf para tener soporte completo de tipos, y conviertes esta columna en JSONB, puedes filtrar esa columna sin necesidad de desplegar los datos consultables en otras columnas.
  • Curiosidad sobre el proceso de lanzamientos de SQLite.

    • La versión más reciente es la 3.44, y JSONB está incluido en snapshots de pre-lanzamiento.
    • Quieren usar esta función en D1 de Cloudflare y en Fly.io, pero puede que la versión de SQLite no esté publicada o esté personalizada.
    • Los cambios en la API podrían romper la promesa de Cloudflare de poder importar archivos dump/query compatibles con SQLite.
  • Se puede probar JSONB en snapshots de pre-lanzamiento o en el playground.

  • La idea central de la especificación JSONB es que cada elemento empieza con un encabezado que incluye tamaño y tipo.

    • Se sugiere que agregar indicadores de tamaño a la especificación JSON podría reducir la memoria necesaria para procesar JSON.
  • Estoy familiarizado con BSON de MongoDB, pero no con JSONB.

    • Consulta esta entrada de blog que explica la diferencia entre JSONB y BSON.
  • JSONB sí afecta el rendimiento.

  • Ojalá hubiera una forma de comprimir datos JSON entre varias filas.

    • Hay blobs muy similares en cada fila, y hace falta alguna manera de reducir el espacio de almacenamiento para muchos blobs parecidos distribuidos en varias filas.
  • A pesar del formato interno, se puede usar de inmediato desde la aplicación.

    • Por ejemplo, en inserciones por lotes desde Python hay un overhead perceptible por cada llamada de inserción por fila.
    • JSONB puede mejorar el rendimiento usando CTE (Common Table Expressions).
    • json_each puede aceptar parámetros enlazados desde la aplicación como blobs JSONB.