13P by neo 12달전 | favorite | 댓글 1개
  • SQLite의 기존 JSON 함수를 재작성. 사용패턴에 따라 몇배까지 더 빠르게 실행됨
  • 원래 JSON 함수는 3단계로 동작
    1. JSON을 C코드가 쉽게 처리가능한 내부용 바이너리 포맷으로 파싱
    2. 요청한 작업 수행. 특정 필드를 찾거나 JSON을 수정하거나 하는 등
    3. 작업이 JSON을 변경했다면, 내부 바이너리 포맷을 RFC-8279 JSON 문자열로 바꿔서 출력 또는 저장
  • 2단계 말고 1과 3은 오버헤드임
  • SQLite는 많은 포인터를 포함하는 내부 바이너리 형태의 JSON을 사용했음. C 프로그램에 잘 맞지만 시리얼라이즈가 어려움
  • JSONB 재작성을 통해서 이 JSON의 내부 바이너리 표현을 SQL BLOB으로 읽거나 쓸 수 있는 연속된 바이트 배열로 변경
  • 이렇게 하면 내부에서 사용하는 JSON의 표현을 JSON 텍스트 대신 데이터베이스에 저장할 수 있으므로 1단계와 3단계의 오버헤드를 제거할 수 있음

변경된 것

  • 모든 기존 기능은 그대로 유지. 새로운 기능만 추가
  • 이제 JSON 텍스트를 입력으로 받아들이는 모든 JSON 함수는 동일한 매개변수에 대해 JSONB 바이너리 콘텐츠도 받아들임
    • 함수가 텍스트를 가져올지 바이너리 데이터를 가져올지 알려줄 필요가 없음. 함수가 스스로 알아서 판단
  • 이제 JSON을 출력하는 JSON 함수는 두 가지 버전으로 제공
    • 기존의 "json_" 함수는 이전과 동일하게 작동
    • 텍스트 JSON이 아닌 JSONB를 반환하는 "jsonb_" 함수가 있어 일반 처리에서 3단계가 생략됨
  • 애플리케이션을 변경하지 않으면 속도가 약간(1%) 빨라지기는 하지만 모든 것이 기존과 동일하게 계속 작동
  • 그러나 애플리케이션을 수정하여 텍스트 JSON 대신 JSONB를 저장하기 시작하면 적어도 JSON 집약적인 작업의 경우 3배의 성능 향상을 볼 수 있음
  • 또한 JSONB는 대부분의 경우 텍스트 JSON보다 약간 더 작기 때문에(약 5% 또는 10% 더 작음) JSON을 많이 사용하는 경우 데이터베이스 크기가 약간 줄어드는 것을 볼 수도 있음
Hacker News 의견
  • JSONB에 대한 혼란이 많음

    • JSONB는 JSON 데이터 타입과 매우 유사하게 애플리케이션에 사용됨.
    • 애플리케이션은 여전히 JSON 문자열을 읽고 쓰지만, 실제 JSONB 내용은 보지 못함.
    • 동일한 SQL 함수들이 jsonb_ 접두사를 가지고 사용 가능함.
    • JSON 데이터 타입은 디스크에 JSON으로 저장되지만, JSONB는 특별한 바이너리 형식으로 저장됨.
    • JSON 데이터 타입은 작업을 수행하기 위해 전체 JSON을 파싱해야 하지만, JSONB는 파싱 단계를 건너뛰고 디스크 형식에 직접 작업을 수행할 수 있음.
    • 단순히 SQLite에서 전체 JSON 블롭을 읽고 쓰는 경우 JSON 데이터 타입이 적합하지만, SQL을 사용하여 데이터를 쿼리하거나 조작하는 경우 JSONB가 더 적합함.
  • JSONB는 Postgres에서 제공하는 포맷으로, 일반 JSON에 비해 읽기 성능이 향상되어 권장됨.

  • 문서 저장소의 목적을 이해하는 데 몇 년이 걸렸으며, POC(Proof of Concept) 구축에 탁월함.

    • JSON 지원 강화는 SQLite를 적합한 문서 저장소로 만드는 데 도움이 될 것임.
    • Protobuf 메시지를 직렬화 및 역직렬화하여 전체 타입 지원을 받고, 이 컬럼을 JSONB로 만들지 않으면 검색 가능한 데이터를 다른 컬럼으로 펼칠 필요 없이 이 컬럼을 필터링할 수 있음.
  • SQLite의 릴리스 프로세스에 대한 궁금증.

    • 최신 릴리스는 3.44이며, JSONB는 사전 릴리스 스냅샷에 포함됨.
    • Cloudflare의 D1과 Fly.io에서 이 기능을 사용하고 싶지만, SQLite 버전이 공개되지 않았거나 맞춤화되었을 수 있음.
    • API 변경 사항이 SQLite 호환 덤프/쿼리 파일을 가져올 수 있다는 Cloudflare의 약속을 깨뜨릴 수 있음.
  • JSONB를 사전 릴리스 스냅샷이나 플레이그라운드에서 시도할 수 있음.

  • JSONB 사양의 핵심 아이디어는 각 요소가 크기와 타입을 포함하는 헤더로 시작한다는 것임.

    • JSON 사양에 크기 표시를 추가하는 것이 JSON 처리에 필요한 메모리를 줄일 수 있음을 제안함.
  • MongoDB의 BSON에 익숙하지만 JSONB는 아님.

    • JSONB와 BSON의 차이점에 대해 설명하는 블로그 글을 참조함.
  • JSONB는 성능에 영향을 미침.

    • 많은 사람들이 Postgres에서 JSONB를 알고 있을 것임.
    • PGConf NYC 2021에서 Oleg Bartunov가 발표한 'Jsonb 성능 이해' 강연을 보는 것을 권장함.
    • Jsonb 성능 이해 강연 영상
  • 여러 행에 걸쳐 JSON 데이터를 압축하는 방법이 있었으면 함.

    • 매우 유사한 블롭이 각 행에 있으며, 많은 유사한 블롭을 여러 행에 걸쳐 저장 공간을 줄이는 방법이 필요함.
  • 내부 형식에도 불구하고 애플리케이션에서 즉시 사용 가능함.

    • 예를 들어 Python에서의 일괄 삽입에 있어서 행 당 삽입 호출에는 눈에 띄는 오버헤드가 있음.
    • JSONB는 CTE(Common Table Expressions)를 사용하여 성능을 개선할 수 있음.
    • json_each는 애플리케이션에서 JSONB BLOB으로 바인딩된 매개변수를 받아들일 수 있음.