13 puan yazan GN⁺ 2023-12-07 | 1 yorum | WhatsApp'ta paylaş
  • SQLite'ın mevcut JSON işlevleri yeniden yazıldı. Kullanım desenine bağlı olarak birkaç kata kadar daha hızlı çalışıyor
  • Orijinal JSON işlevleri 3 aşamada çalışıyordu
    1. JSON'u, C kodunun kolayca işleyebileceği dahili bir ikili biçime ayrıştırma
    2. İstenen işlemi gerçekleştirme; belirli bir alanı bulma ya da JSON'u değiştirme gibi
    3. İşlem JSON'u değiştirdiyse, dahili ikili biçimi çıktı veya depolama için RFC-8279 JSON dizgesine dönüştürme
    1. aşama dışındaki 1 ve 3, ek yük oluşturuyordu
  • SQLite, çok sayıda işaretçi içeren dahili ikili JSON biçimi kullanıyordu. Bu, C programları için uygundu ancak serileştirmesi zordu
  • JSONB yeniden yazımıyla birlikte, bu JSON'un dahili ikili gösterimi SQL BLOB olarak okunup yazılabilen bitişik bir bayt dizisine dönüştürüldü
  • Böylece dahilde kullanılan JSON gösterimi, JSON metni yerine veritabanında saklanabildiği için 1. ve 3. aşamaların ek yükü ortadan kaldırılabiliyor

Değişenler

  • Mevcut tüm işlevler aynen korunuyor. Yalnızca yeni özellikler ekleniyor
  • Artık JSON metnini girdi olarak alan tüm JSON işlevleri, aynı parametreler için JSONB ikili içeriğini de kabul ediyor
    • İşleve metin mi yoksa ikili veri mi alacağını söylemeye gerek yok. İşlev bunu kendi kendine ayırt ediyor
  • Artık JSON üreten JSON işlevleri iki sürüm halinde sunuluyor
    • Mevcut json_ işlevleri eskisiyle aynı şekilde çalışıyor
    • Metin JSON yerine JSONB döndüren jsonb_ işlevleri var; böylece genel işlem akışında 3. aşama atlanıyor
  • Uygulama değiştirilmezse hız biraz (%1) artıyor, ancak her şey eskisi gibi çalışmaya devam ediyor
  • Ancak uygulamayı değiştirip metin JSON yerine JSONB depolamaya başlarsanız, en azından JSON yoğun iş yüklerinde 3 kata kadar performans artışı görebilirsiniz
  • Ayrıca JSONB çoğu durumda metin JSON'dan biraz daha küçüktür (yaklaşık %5 ila %10 daha küçük), bu nedenle JSON'u yoğun kullanan durumlarda veritabanı boyutunda da bir miktar azalma görülebilir

1 yorum

 
GN⁺ 2023-12-07
Hacker News görüşleri
  • JSONB konusunda çok fazla kafa karışıklığı var

    • JSONB, uygulamada JSON veri tipine çok benzer şekilde kullanılır.
    • Uygulama hâlâ JSON dizelerini okur ve yazar, ancak gerçek JSONB içeriğini görmez.
    • Aynı SQL işlevleri jsonb_ önekiyle kullanılabilir.
    • JSON veri tipi diskte JSON olarak saklanırken, JSONB özel bir ikili biçimde saklanır.
    • JSON veri tipi işlem yapmak için tüm JSON'u ayrıştırmak zorundayken, JSONB ayrıştırma adımını atlayıp doğrudan disk biçimi üzerinde çalışabilir.
    • SQLite'ta yalnızca tüm JSON blob'unu okuyup yazıyorsanız JSON veri tipi uygundur; ancak SQL kullanarak veriyi sorguluyor veya işliyorsanız JSONB daha uygundur.
  • JSONB, Postgres'in sunduğu bir biçimdir ve normal JSON'a kıyasla okuma performansını artırdığı için önerilir.

  • Belge deposunun amacını anlamak yıllar aldı ve POC (Proof of Concept) oluşturmak için mükemmel.

    • JSON desteğinin güçlenmesi, SQLite'ı uygun bir belge deposu hâline getirmeye yardımcı olacaktır.
    • Protobuf mesajlarını serileştirip geri açarak tam tip desteği alabilir ve bu sütunu JSONB yaparsanız, aranabilir verileri başka sütunlara açmaya gerek kalmadan bu sütun üzerinde filtreleme yapabilirsiniz.
  • SQLite'ın sürüm sürecine dair merak var.

    • En son sürüm 3.44 ve JSONB ön sürüm snapshot'larında yer alıyor.
    • Bu özelliği Cloudflare'ın D1'ında ve Fly.io'da kullanmak istiyorlar, ancak SQLite sürümü açıklanmamış ya da özelleştirilmiş olabilir.
    • API değişiklikleri, Cloudflare'ın SQLite uyumlu dump/sorgu dosyalarını içe aktarma vaadini bozabilir.
  • JSONB, ön sürüm snapshot'larında veya playground'da denenebilir.

  • JSONB spesifikasyonunun temel fikri, her öğenin boyut ve tipi içeren bir başlıkla başlamasıdır.

    • JSON spesifikasyonuna boyut göstergeleri eklemenin, JSON işlemek için gereken belleği azaltabileceği öne sürülüyor.
  • MongoDB'nin BSON'una aşina olanlar var, ancak JSONB'ye değil.

    • JSONB ile BSON arasındaki farkları açıklayan şu blog yazısına bakılıyor.
  • JSONB performansı etkiler.

  • JSON verisini birden fazla satır boyunca sıkıştırmanın bir yolu olsaydı iyi olurdu.

    • Her satırda çok benzer blob'lar var ve birçok benzer blob'u birden fazla satıra yayarak depolama alanını azaltacak bir yönteme ihtiyaç duyuluyor.
  • İç biçime rağmen uygulamada hemen kullanılabilir.

    • Örneğin Python'da toplu ekleme sırasında, satır başına ekleme çağrısında fark edilir bir ek yük vardır.
    • JSONB, CTE (Common Table Expressions) kullanarak performansı iyileştirebilir.
    • json_each, uygulamada JSONB BLOB olarak bağlanan parametreleri kabul edebilir.