13 पॉइंट द्वारा GN⁺ 2023-12-07 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • SQLite के मौजूदा JSON functions को फिर से लिखा गया है. उपयोग पैटर्न के अनुसार यह कई गुना तक तेज़ चल सकता है
  • मूल JSON functions 3 चरणों में काम करते थे
    1. JSON को ऐसे internal binary format में parse करना जिसे C code आसानी से प्रोसेस कर सके
    2. मांगा गया काम करना, जैसे किसी खास field को ढूंढना या JSON को संशोधित करना
    3. अगर काम के दौरान JSON बदला गया हो, तो internal binary format को RFC-8279 JSON string में बदलकर output या store करना
  • चरण 2 को छोड़कर 1 और 3 overhead थे
  • SQLite JSON के internal binary रूप का उपयोग करता था, जिसमें कई pointers होते थे. यह C programs के लिए उपयुक्त था, लेकिन serialize करना कठिन था
  • JSONB rewrite के जरिए इस JSON के internal binary representation को एक continuous byte array में बदला गया है, जिसे SQL BLOB के रूप में पढ़ा या लिखा जा सकता है
  • इससे internal JSON representation को JSON text की जगह database में store किया जा सकता है, इसलिए चरण 1 और 3 का overhead हटाया जा सकता है

क्या बदला है

  • सभी मौजूदा features वैसे ही बने रहेंगे. केवल नई functionality जोड़ी गई है
  • अब JSON text को input के रूप में स्वीकार करने वाले सभी JSON functions, उन्हीं parameters के लिए JSONB binary content भी स्वीकार करेंगे
    • यह बताने की ज़रूरत नहीं होगी कि function को text लेना है या binary data. function खुद ही पहचान लेगा
  • अब JSON output देने वाले JSON functions दो versions में उपलब्ध हैं
    • मौजूदा json_ functions पहले की तरह ही काम करेंगे
    • jsonb_ functions text JSON के बजाय JSONB लौटाते हैं, इसलिए सामान्य processing में चरण 3 छोड़ दिया जाता है
  • अगर application में कोई बदलाव न किया जाए, तब भी speed थोड़ी (1%) बढ़ेगी, लेकिन बाकी सब पहले की तरह काम करता रहेगा
  • लेकिन अगर application को बदलकर text JSON की जगह JSONB store करना शुरू किया जाए, तो कम से कम JSON-intensive workloads में 3 गुना performance improvement देखा जा सकता है
  • साथ ही, ज़्यादातर मामलों में JSONB text JSON से थोड़ा छोटा होता है (लगभग 5% या 10% छोटा), इसलिए अगर JSON का बहुत उपयोग होता है तो database size भी थोड़ा कम हो सकता है

1 टिप्पणियां

 
GN⁺ 2023-12-07
Hacker News राय
  • JSONB को लेकर काफी भ्रम है

    • JSONB को application में JSON data type की तरह ही इस्तेमाल किया जाता है.
    • application अब भी JSON strings को पढ़ती और लिखती है, लेकिन वास्तविक JSONB content को नहीं देखती.
    • वही SQL functions jsonb_ prefix के साथ उपलब्ध हैं.
    • JSON data type डिस्क पर JSON के रूप में store होता है, जबकि JSONB एक विशेष binary format में store होता है.
    • JSON data type में operations करने के लिए पूरे JSON को parse करना पड़ता है, लेकिन JSONB parsing step को छोड़कर सीधे disk format पर काम कर सकता है.
    • अगर आप SQLite में सिर्फ पूरा JSON blob पढ़ते और लिखते हैं, तो JSON data type ठीक है, लेकिन अगर SQL से data को query या manipulate करना है, तो JSONB ज्यादा उपयुक्त है.
  • JSONB, Postgres द्वारा दिया गया format है, और सामान्य JSON की तुलना में बेहतर read performance के कारण इसकी सिफारिश की जाती है.

  • document store के उद्देश्य को समझने में कई साल लगे, और यह POC(Proof of Concept) बनाने के लिए बेहतरीन है.

    • JSON support को मजबूत करना SQLite को एक उपयुक्त document store बनाने में मदद करेगा.
    • Protobuf messages को serialize और deserialize करके full type support मिल सकता है, और अगर इस column को JSONB बनाया जाए, तो searchable data को अलग columns में फैलाने की जरूरत के बिना इसी column पर filtering की जा सकती है.
  • SQLite के release process को लेकर जिज्ञासा है.

    • latest release 3.44 है, और JSONB pre-release snapshot में शामिल है.
    • Cloudflare के D1 और Fly.io में इस feature का उपयोग करना चाहते हैं, लेकिन SQLite version public नहीं है या शायद customized है.
    • API changes, SQLite-compatible dump/query files को import कर पाने के Cloudflare के वादे को तोड़ सकते हैं.
  • JSONB को pre-release snapshot या playground में आज़माया जा सकता है.

  • JSONB spec का मुख्य विचार यह है कि हर element एक header से शुरू होता है जिसमें size और type शामिल होते हैं.

    • यह सुझाव दिया गया कि JSON spec में size markers जोड़ने से JSON processing के लिए आवश्यक memory कम हो सकती है.
  • MongoDB के BSON से परिचित हैं, लेकिन JSONB से नहीं.

  • JSONB performance को प्रभावित करता है.

  • काश कई rows में फैले JSON data को compress करने का कोई तरीका होता.

    • हर row में बहुत मिलते-जुलते blobs हैं, और कई समान blobs के लिए rows के पार storage space कम करने का तरीका चाहिए.
  • internal format के बावजूद यह application में तुरंत उपयोग योग्य है.

    • उदाहरण के लिए, Python में bulk inserts के दौरान per-row insert calls में ध्यान देने योग्य overhead होता है.
    • JSONB, CTE(Common Table Expressions) का उपयोग करके performance बेहतर कर सकता है.
    • json_each application से JSONB BLOB के रूप में bind किए गए parameters स्वीकार कर सकता है.