- มีการเขียนฟังก์ชัน JSON เดิมของ SQLite ใหม่ ทำให้ทำงานได้เร็วขึ้นหลายเท่าตามรูปแบบการใช้งาน
- เดิมฟังก์ชัน JSON ทำงานเป็น 3 ขั้นตอน
- แปลง JSON เป็นฟอร์แมตไบนารีภายในที่โค้ด C จัดการได้ง่าย
- ทำงานตามที่ร้องขอ เช่น ค้นหาฟิลด์เฉพาะหรือแก้ไข JSON
- หากงานนั้นมีการเปลี่ยนแปลง JSON ก็จะแปลงฟอร์แมตไบนารีภายในกลับเป็นสตริง JSON ตาม RFC-8279 เพื่อส่งออกหรือจัดเก็บ
- นอกเหนือจากขั้นตอนที่ 2 แล้ว ขั้นตอนที่ 1 และ 3 ถือเป็น overhead
- SQLite ใช้ JSON ในรูปแบบไบนารีภายในที่มี pointer จำนวนมาก ซึ่งเหมาะกับโปรแกรม C แต่ทำ serialization ได้ยาก
- ด้วยการเขียน JSONB ใหม่ จึงเปลี่ยนการแทนค่าไบนารีภายในของ JSON นี้ให้เป็นอาร์เรย์ไบต์ต่อเนื่องที่สามารถอ่านหรือเขียนเป็น SQL BLOB ได้
- วิธีนี้ทำให้สามารถเก็บรูปแบบ JSON ที่ใช้ภายในลงในฐานข้อมูลแทน JSON แบบข้อความได้ จึงตัด overhead ของขั้นตอนที่ 1 และ 3 ออกไปได้
สิ่งที่เปลี่ยนไป
- ฟังก์ชันเดิมทั้งหมดยังคงอยู่เหมือนเดิม มีเพียงการเพิ่มความสามารถใหม่เท่านั้น
- ตอนนี้ฟังก์ชัน JSON ทุกตัวที่รับ JSON แบบข้อความเป็นอินพุต จะรับเนื้อหาไบนารี JSONB สำหรับพารามิเตอร์เดียวกันได้ด้วย
- ไม่จำเป็นต้องบอกฟังก์ชันว่าจะรับข้อความหรือข้อมูลไบนารี เพราะฟังก์ชันจะตรวจสอบและตัดสินใจเอง
- ตอนนี้ฟังก์ชัน JSON ที่ส่งออก JSON มีให้ 2 เวอร์ชัน
- ฟังก์ชัน "json_" แบบเดิมยังทำงานเหมือนก่อน
- มีฟังก์ชัน "jsonb_" ที่คืนค่าเป็น JSONB แทน JSON แบบข้อความ ทำให้ข้ามขั้นตอนที่ 3 ไปได้ในการประมวลผลทั่วไป
- หากไม่เปลี่ยนแอปพลิเคชัน ความเร็วจะเพิ่มขึ้นเล็กน้อย (1%) แต่ทุกอย่างยังคงทำงานเหมือนเดิม
- แต่หากแก้แอปพลิเคชันให้เริ่มเก็บ JSONB แทน JSON แบบข้อความ อย่างน้อยในงานที่ใช้ JSON หนัก ๆ อาจเห็นประสิทธิภาพเพิ่มขึ้น 3 เท่า
- นอกจากนี้ JSONB ยังมีขนาดเล็กกว่า JSON แบบข้อความเล็กน้อยในกรณีส่วนใหญ่ (เล็กกว่าประมาณ 5% หรือ 10%) ดังนั้นหากมีการใช้ JSON จำนวนมาก ก็อาจเห็นขนาดฐานข้อมูลลดลงเล็กน้อย
1 ความคิดเห็น
ความเห็นบน Hacker News
มีความสับสนเกี่ยวกับ JSONB อยู่มาก
jsonb_JSONB เป็นฟอร์แมตที่มีใน Postgres และมักแนะนำให้ใช้เพราะมีประสิทธิภาพในการอ่านดีกว่า JSON ปกติ
ใช้เวลาหลายปีกว่าจะเข้าใจเป้าหมายของ document store และมันยอดเยี่ยมมากสำหรับการสร้าง POC (Proof of Concept)
มีความสงสัยเกี่ยวกับกระบวนการออกรุ่นของ SQLite
สามารถลองใช้ JSONB ได้ในสแนปช็อตก่อนรีลีสหรือใน playground
แนวคิดหลักของสเปก JSONB คือแต่ละองค์ประกอบจะเริ่มต้นด้วย header ที่มีขนาดและชนิดข้อมูลอยู่ในนั้น
คุ้นเคยกับ BSON ของ MongoDB แต่ไม่คุ้นกับ JSONB
JSONB ส่งผลต่อประสิทธิภาพ
อยากให้มีวิธีบีบอัดข้อมูล JSON ข้ามหลายแถวได้
แม้จะเป็นฟอร์แมตภายใน แต่แอปพลิเคชันก็สามารถใช้งานได้ทันที
json_eachสามารถรับพารามิเตอร์ที่ bind จากแอปพลิเคชันเป็น JSONB BLOB ได้