Oracle und JSON: Vom CLOB über den nativen Datentyp zu Duality Views

Shownotes

Oracle und JSON: Vom CLOB über den nativen Datentyp zu Duality Views

Wie das Format des Internets in die relationale Welt kommt

JSON ist das Textformat mit den geschweiften und eckigen Klammern, das praktisch jeder schon einmal gesehen hat. Das Akronym steht für JavaScript Object Notation, entstanden Ende der 90er, um JavaScript-Objekte zu persistieren. Heute ist JSON die Lingua Franca des Internets. Jeder Webservice und jedes API spricht es. In Folge 005 fragt Johannes aus der DBA-Ecke, und Robert erklärt aus Entwicklersicht, wie dieses verschachtelte Dokumentenformat in eine relationale Datenbank kommt.

Der Einstieg ist überraschend einfach. JSON ist reiner Text, also passt es in jede Spalte, die Text speichern kann. Bis 4000 Zeichen reicht eine VARCHAR2-Spalte, im Extended Mode sogar bis 32.000. Für größere Dokumente liegt das CLOB nahe, doch Oracle rät davon ab. Der Grund ist die Kodierung. JSON liegt per Definition immer in UTF-8 vor, deshalb kann man sich den NLS-Layer und den CLOB-Overhead mit den doppelten Bytes pro Zeichen sparen und speichert besser im BLOB. Bis Oracle 21 war das die einzige Möglichkeit.

Ab Oracle 21 und fest mit 23, das mittlerweile als 26ai firmiert, gibt es einen eigenen Datentyp namens JSON. Intern speichert er im OSON-Format, das die Keys nach oben zieht und die Werte separat ablegt und intern verpointert. Spannend daran: Der Aufbau des OSON-Formats ist offen. Zum Aufnahmezeitpunkt war er über die quelloffenen Thin Driver für Python und JavaScript nachlesbar, inzwischen hat Oracle nachgelegt und OSON als eigenständige Spezifikation (Version 1.0) unter osonspec.org veröffentlicht, dazu eine Java-Referenzimplementierung auf GitHub unter der Universal Permissive License. Damit folgt Oracle MongoDB und PostgreSQL, die ihre Formate ebenfalls offengelegt haben. Zur Einordnung, weil Robert das im Podcast verkürzt hat: Offen sind Format und Referenzimplementierung, nicht der JSON-Datentyp der Datenbank selbst. Womit auch die Frage im Raum steht, ob man überhaupt noch eine MongoDB braucht. Robert zeigt, dass die Oracle-Datenbank mit konfiguriertem ORDS im Mongo-Mode laufen kann und für die Clients ununterscheidbar von einer echten MongoDB wird.Abgefragt wird natürlich mit SQL. Für eindeutige Pfade ohne Arrays ist die Dot-Notation richtig bequem. Sobald es komplexer wird, kommt JSON_TABLE ins Spiel, ein Operator, der in der FROM-Clause lebt. Man gibt ihm das JSON-Dokument, definiert mit dem Row Producer, welche Elemente zu Zeilen werden, und legt die Spalten fest. Heraus kommen Zeilen und Spalten wie aus jeder anderen Tabelle, die sich joinen, filtern und sortieren lassen. Bei der Performance hilft das ganze Oracle-Arsenal. Text-Indizes, Function-Based-Indexes auf JSON_VALUE und JSON_QUERY und beim nativen Datentyp eigene JSON-Indizes mit eigenen Operatoren im Ausführungsplan.

Das Highlight zum Schluss sind die JSON Relational Duality Views aus Oracle 23. Sie mappen JSON-Dokumente bidirektional auf relationale Tabellen. Man wirft ein JSON-Dokument in die View, und sie verteilt es im Hintergrund automatisch auf normalisierte Tabellen. Umgekehrt liefert ein Select aus der View ein fertiges JSON-Dokument zurück. Für Robert ist das eine echte Kampfansage an die Object-Relational-Mapper. Java-Entwickler, die heute Hibernate brauchen, könnten künftig auf Duality Views setzen und sich den Mapper sparen.

Diese Folge in der Übersicht:

  • JSON steht für JavaScript Object Notation, entstand Ende der 90er und ist heute die Lingua Franca des Internets.
  • JSON ist reiner Text und passt in jede Textspalte. Bis 4000 Zeichen reicht VARCHAR2, im Extended Mode bis 32.000.
  • Für größere Dokumente rät Oracle zu BLOB statt CLOB, weil JSON immer UTF-8 ist und so NLS-Layer und CLOB-Overhead entfallen.
  • Mit einem IS-JSON-Check-Constraint weiß die Datenbank, dass der Text in der Spalte JSON ist.
  • Ab Oracle 21 gibt es den nativen JSON-Datentyp mit dem OSON-Speicherformat. Der Aufbau von OSON ist über die Python- und JavaScript-Thin-Driver quelloffen, nicht der Datentyp selbst.
  • Mit konfiguriertem ORDS läuft die Oracle-Datenbank im Mongo-Mode und kann eine MongoDB komplett ersetzen. code text here
  • Abgefragt wird mit SQL: Dot-Notation für einfache Pfade, JSON_TABLE in der FROM-Clause für vollwertige Zeilen und Spalten zum Joinen, Filtern und Sortieren.
  • Indizierbar mit Text-Indizes, Function-Based-Indexes und nativen JSON-Indizes inklusive eigener Operatoren im Ausführungsplan.
  • JSON Relational Duality Views in Oracle 23 mappen JSON bidirektional auf relationale Tabellen, eine echte Kampfansage an Hibernate und die ORM-Welt.
  • Mongo-Mode und Duality Views sind jeweils eigene große Themen, die eine eigene Folge verdienen.

Weiterführende Links und Ressourcen:

Die Podcast-Hosts und Director:

  • Johannes Ahrends: Oracle ACE, DBA, ora2know. Web: carajandb.com
  • Robert Marz: Oracle ACE, IT-Architect, ora2know. Web: robbie.databee.org
  • Oliver Pyka: Oracle ACE, Freiberufler, ora2know. Web: pyka.de

Über O wie Datenbank:

Der deutschsprachige Oracle-Datenbank-Podcast von ora2know. Johannes Ahrends, Robert Marz und Oliver Pyka bringen zusammen über 90 Jahre Oracle-Erfahrung mit und sprechen alle vier Wochen über das, was DBAs, Entwickler und IT-Entscheider wirklich bewegt: Migration, Architektur, neue Features, Betrieb und Strategie rund um die Oracle Datenbank. Praxisnah, meinungsstark und ohne Marketing-Sprech.

Über ora2know:

Wissen teilen, Netzwerk aufbauen. ora2know ist eine unabhängige Community für Oracle-Datenbank-Administratoren und -Entwickler im deutschsprachigen Raum. Unser Ziel ist der praxisnahe Austausch von Wissen und Erfahrungen rund um Oracle Database, Oracle APEX und Oracle AI. Ohne kommerzielle Interessen, getragen von Enthusiasmus und gegenseitiger Hilfe. Ob DBA, Entwickler oder Architekt: ora2know verbindet Oracle-Profis in Deutschland, Österreich und der Schweiz.

Über diese Podcast-Produktion:

Dieser Podcast ist eine TON.EINS Produktion.

Transkript anzeigen

00:00:03:

00:00:10: Moin Robert, wir haben ja einen gemeinsamen Kunden der sich mit ORDS auseinandersetzt und eben als Element da drin irgendwie so was hat wie Gustav Karl oder Jason oder so ähnlich.

00:00:23: Was kannst du uns darüber erzählen?

00:00:27: Ja, Jason ist ein Dokument-Austauschformat und Jason lebte in unserer Datenbank satneuesten und hat seinen eigenen Datentyp bekommen.

00:00:34: Ist das nicht auch html?

00:00:36: Html ist sowas auch aber wenn es darum geht strukturierende Inhalte durch die Gegend zu transportieren nimmt man lieber Jason.

00:00:42: Hat glaube ich jeder schon mal gesehen dass es dieses komische Text Format mit den geschweiften und den eckigen Klammern drin.

00:00:49: Das ist es im Wesentlichen auch.

00:00:51: Und wofür steht Jason?

00:00:53: JSON ist eine Abkürzung, das steht für JavaScript Object Notation.

00:00:58: Das wurde entwickelt Ende der Neunziger um JavaScript-Objekte zu persistieren.

00:01:05: Die Webentwickler haben damals angefangen die Webseiten langsam ein bisschen ins Leben zu heben und mit JavaScript auch ein bisschen interaktiv zu machen müssten ihre Daten ja auch irgendwo zwischendrin mal speichern, dass es die Sessions überlebt und da hat man einen Dateiformat gebraucht.

00:01:21: Und da ist Jason bei rausgekommen.

00:01:24: also JavaScript Object Notation das Persistenzformat für JavaScript Modelle.

00:01:29: Das ist so flexibel und so praktisch, dass sich das durchgesetzt hat und dass man das heute quasi ein bisschen als Lingua Franca des Internets nimmt.

00:01:36: Also im Prinzip jeder Web-Service jedes API spricht mindestens auch Jason – auch wenn's mittlerweile noch Alternativen gibt!

00:01:44: Das hört sich so ein bisschen an wie passt nicht ganz zu relationalen Datenbanken, oder?

00:01:49: Das stimmt.

00:01:50: JSON-Dokumente selbst sind beliebig schachtelbar das heißt die bringen eigentlich ihre eigenen Relationen und Datenstrukturen mit.

00:01:58: wenn ich es in der Datenbank oder wenn ich die Inhalte von JSON Dokumenten speichern möchte dann möchte ich sie in den Regeln in den relationalen Tabellen mapen aber manchmal muss ich das ja auch nicht.

00:02:07: Wenn ich nur JSON Dokumente austauschen will kann ich JSON auch direkt in eine Datenbank speichert.

00:02:11: Das heißt, muss die Datemank dafür irgendwas haben?

00:02:14: Braucht sie dafür?

00:02:15: oder kann ich einfach sagen wir haben ja unsere B-Lobs oder irgendwie sowas und ich hau den ganzen Summs da rein.

00:02:20: Genau so!

00:02:21: Also damit ging es auch los.

00:02:22: also letztlich Jason sind Textdokumenten reiner Text und das heißt an jeder Tabellen-Spalten, der ich Text speichern kann.

00:02:29: Kann ich auch einen JSON-Dokument unterbringen?

00:02:31: Also ich muss gar nicht auf B-Lobs oder C-Labs gehen sondern ich kann das auch in einer Wacherspalte mitmachen.

00:02:36: Da muss ich halt darauf achten dass das JSON Dokument nicht größer als viertausend Zeichen ist oder wenn ich im Extended Mode bin auf zweiunddreißig tausend zeichen.

00:02:45: Wenn mir das reicht und ich sicher bin, dass mir das reicht, dann kann ich es auch in Wacharspeichen abspalten.

00:02:49: Ansonsten hast du aber natürlich völlig recht.

00:02:51: Dann gehe ich auf die Lopspalten Typen.

00:02:53: Das was einem Erst mal in den Sinn kommt, ist natürlich das C-Lob.

00:02:57: Das ist das Character Lob weil es geht ja um Text Dateien.

00:03:00: Red Oracle aber tatsächlich davon ab.

00:03:02: Weil einer der großen oder einer der festen Punkte von JSON ist dass es per Definition immer im UTF-Acht Format vorliegt also JSON.

00:03:11: Dokumente gibt es in keiner anderen Kodierung und damit kann ich mir diesen Kodierungslehrer sparen, also den NLS-Lehrer in der Datenbank.

00:03:20: Ich muss die Zeichensatze nicht konvertieren weil ich ja weiß dass es immer UTF-Acht ist.

00:03:25: und dann kann ich mir auch den CLOP Overhead sparen mit den doppelten Bytes, weil CLOPs werden in UTF Acht ja immer als zwei Bytes pro Zeichen abgespeichert und kann das in Blobs machen.

00:03:34: und dann habe ich das einigermaßen fixen Blobs.

00:03:37: und bis Oracle... ...einundzwanzig war das auch die einzige Möglichkeit.

00:03:42: Das

00:03:42: bedeutet, jetzt ist alles viel besser?

00:03:44: Viel besser

00:03:45: weiß ich nicht.

00:03:45: Aber Oracle ... oder also einundzwanzig und jetzt natürlich dreiundzwannzig oder wie es unberannt worden ist, sechsundzwantig hat einen eigenen Datentyp dafür bekommen.

00:03:54: Und der Datentypen nennt sich... Also der nennt mich tatsächlich Jason das heißt Ich kann eine Tabelle anlegen und da kann ich eine Spalte reintun vom Datentype Jason und die hat ihr eigenes Format.

00:04:05: Das nennt sie Abspeicherformat, das nennt man Oson.

00:04:08: Ich vermute mal für Oracle Ja, und dann irgendwas anderes.

00:04:12: Das ist tatsächlich Open Source.

00:04:13: also das kann man sich angucken.

00:04:15: da gibt es den gegen Queco dazu auf GitHub.

00:04:17: Open Source und Oracle?

00:04:19: Das passt doch nicht wirklich oder?

00:04:21: Passt nicht wirklich habe ich auch erst gedacht.

00:04:23: aber Oracle folgt da so ein bisschen in anderen großen Daten banken.

00:04:26: Also gibt ja eine ganze Reihe Datenmanken, die sich explizit nur um JSON-Dokumente kümmern.

00:04:31: Also der größte Anbieter dort ist zum Beispiel MongoDB.

00:04:34: Das waren auch die Ersten, die damit angefangen haben.

00:04:36: Die haben ihren eigenen JSON Datentyp und haben den Open Source und Postgres ist irgendwann nachgezogen.

00:04:42: Sie haben auch ihr eigenes Format und haben das auch geopen sourced.

00:04:45: Und da hat Oracle wahrscheinlich gedacht, da wollen wir jetzt nicht hinten anstehen oder so.

00:04:50: Aber tatsächlich, Oracle öffnet sich langsam immer mehr und es gibt immer mehr Sachen, die auch Oracle als open source veröffentlicht Und der Osaundatentyp ist einer davon.

00:04:58: Interessant, aber du sprichst gerade Mongo an.

00:05:02: Brauche ich dann keine Mongo-Datenbank mehr?

00:05:03: Sollte ich das lieber in Oracle machen?

00:05:05: oder wie sieht es aus?

00:05:06: Wenn Du eine Oracle Vertriebler fragst, der sagt natürlich klar.

00:05:10: Praktisch ist es so wenn Dir eine Mongo Datenbank reicht, kannst Du auch eine Mongo Datenbank nehmen.

00:05:15: Aber die Oracle Datenbank hat riesige Vorteile also einfach die ganze Stabilität und die Skalierbarkeit dass, wenn ich mein ORDS, also mein Oracle REST Data Services konfiguriert habe.

00:05:29: Dann kann ich die Oracle Datenbank im Mongo-Mode betreiben.

00:05:32: Das heißt, die Oracle-Datenbank ist dann komplett kompatibel zu Mongo Datenbank und die Kleins merken gar nicht, dass sie im Hintergrund gar nicht mehr eine Mongo Datenbank ansprechen sondern eine Oracle Datenbunk.

00:05:42: Also ja!

00:05:43: Ich kann mit Oracle-Mongo Datenbanken kompletter setzen.

00:05:47: Spannend!

00:05:48: Müssen wir uns auch nochmal vielleicht darüber auseinandersetzen?

00:05:51: Das ist, glaube ich eine ganz eigene Folge.

00:05:53: Wenn wir über Orts und deren Möglichkeiten reden, dann sollten wir uns da noch mal drin kümmern.

00:05:58: Weil das auch tatsächlich ein komplexes Thema ist.

00:06:00: Jetzt haben wir einmal zurück.

00:06:01: Wir leben ja in unserer Relational-Datenbank Und jetzt kommt so ein Jason um die Ecke und sagt Ich habe das alles in einem C-Lob.

00:06:08: Wie frage ich das denn jetzt ab?

00:06:09: Naja, wir sind im Dorakal.

00:06:11: wie Frage ich?

00:06:11: Daten hab mit SQL natürlich.

00:06:13: Und zunächst einmal kann ich es ganz normal abfragen Dann krieg' ich halt mein JSON Dokument zurück.

00:06:18: Das hilft mir natürlich nicht!

00:06:20: mein JSON-Dokument in einer C-Lob-Spalte habe und dann ein Check-Constraint drauf lege, das heißt ist jasen.

00:06:28: Dann weiß die Datenbank zumindest schon mal dass der Text da drinnen es JASEN ist.

00:06:32: Und dann hab ich die sogenannte Dot Notation.

00:06:34: Das heißt Ich kann mich durch das Dokument, durch die Dokumentenstruktur durchhangeln Also von Objekt zu Objekt und kann die mit Punkten ineinander hängen und kann dort Sachen abfragen.

00:06:44: Das klappt für alles sehr gut wo ich keine Arrays drin habe also wo ich eindeutig Werte finde Da ist es dann auch richtig bequem.

00:06:52: Ansonsten gibt es jede Menge Operatoren, der wichtigste ist zum Beispiel der JSON-Table.

00:06:58: Das ist ein Operator also keine Funktion.

00:07:00: das heißt JSON Table lebt in der From clause d.h.

00:07:04: ich mache Select Spaltename from und dann JSON Table.

00:07:07: Und dem JSON Table Operator gebe ich einen JSON Dokument rein und dann gebe ich ihm zwei Optionsblöcke rein, der eine ist der sogenannte Row Producer wo ich eben mit festlege, welche Elemente in meinem JSON-Dokument zu zeilen werden sollten und dann kann ich noch definieren was da für Spalten zurückkommen sollen.

00:07:25: Und dann habe ich mit einem Select oder innerhalb von meinem Select späten habe ich Zeilen und Spalten so wie das von jeder anderen Tabelle auch gewohnt sind und die kann ich joinen, also mit anderen Tabellen abfragen, kann sortieren, kann filtern, kann machen damit was ich will und dass es nicht nur total cool sondern auch wirklich richtig schnell und effizient implementiert.

00:07:44: Das macht richtig Spaß damit zu arbeiten!

00:07:46: Ja gut, die eine Sache ist die Implementierung.

00:07:49: Was ist denn mit der Abfrage?

00:07:50: Wie sieht es dann mit der Performance aus?

00:07:51: Mache ich da permanent Full Table Scans?

00:07:54: weil ich kann ja nicht in dem C-Lob nicht so einen Bereich irgendwie indizieren oder sowas?

00:07:58: wie habe ich mir das vorzustellen.

00:08:00: Erstmal ist es so.

00:08:01: meine Abfrage ist wenn alles was nicht Jason isst hat die normalen Oracle Mechanisman.

00:08:06: Das heißt wie du schon richtig gesagt hast Full Table Scan.

00:08:08: Ich hab ja meistens im meiner Tabelle nicht nur die eine Jason Spalte sondern auch die anderen Spalten mittrum rum.

00:08:13: Die kann ich natürlich ganz normal filtern und indiziere.

00:08:16: Auf diese JSON-Dokumente kann ich auch Text in die Cs drauflegen, wenn sich im Text Datentyp bin.

00:08:23: Das macht das schon mal ein bisschen schneller!

00:08:25: Ich kann noch Functional Based Index darauf legen auf so JSON Value und JSON Query Expressions – das macht es auch nochmal schneller.

00:08:32: aber richtig gut wird es, wenn ich den JSON Datentypen verwende weil der nämlich ist JSON Dokumente, meiner Spalte-Abspeicher indiziert und ein bisschen umbaut.

00:08:42: Und die tatsächlichen Felder, also die Key.

00:08:45: in JSON speichere ich ja Key und Keys mit Values ab, also Key-Value-Pers.

00:08:49: Also der legt die keys nach oben und speichert die Daten auch nicht als Key- Value-Per ab sondern die Daten extra und dann intern verpointert, also der optimiert die ganze Geschichte.

00:08:58: Da kann ich da noch eigene Indextypen, die ich da nochmal mit drauflegen kann und dann wird es richtig performant.

00:09:03: Also dann kann ich richtig viele Daten in meiner Datemank abspeichern.

00:09:07: Das heißt also an der Stelle kann ich auch hingehen als normaler Alltags Performance Optimierer und da gucken, wie die Ausführungspläne usw.

00:09:16: sind?

00:09:17: Gibt es das?

00:09:18: Aber natürlich, wir sind in der Oracle-Welt.

00:09:19: Da gibt es extra Ausführungspläne also extra Operatoren in den Ausführungsplänen wo ich mir das mit anschauen kann.

00:09:25: da kann ich mich austoben wie ich das mit allen anderen Abfragen auch machen will und kann jedes Quentchen Performance rausholen.

00:09:32: Und dafür ist Oracle ja bekannt dass es parallel arbeitet und dass man an allen möglichen Rädchen drehen kann damit er schneller wird.

00:09:39: Ist das eigentlich eine komplett eigene Welt so dass sich halt nur Jason mache oder nur relational?

00:09:44: oder gibt es da auch so irgendwas, welche Übergänge?

00:09:48: Da

00:09:48: gibt's natürlich auch Übergange.

00:09:49: Also das Mega-Feature, wenn was mir im Stichwort Übergenge mit in den Sinn kommt sind die JSON Relational Duality Views.

00:09:57: Das ist das Keyfeature hinter aus der JSON-Welt dass mit Oracle XXIII eingeführt wird und das ist richtig gut weil damit kann ich Views anlegen, die JSON Dokumente auf relative Tabellen mapen Und dann kann ich in diese View einen JSON-Dokument reinschmeißen und kann den JSON Dokument zum Updaten mit reinschneisen.

00:10:14: Und die View im Hintergrund verteilt das automatisch auf relationale Tabellen oder andersrum, ich habe eine relative Struktur, die ich mir dieser View nachbilde und kann einen Select machen und kriege dann ein JSON Document raus was genau diesen Geschichten entspricht.

00:10:29: Weil in JSON Documenten sie sind ja nicht normalisiert, die sind ja denormalisiert weil ich halt innerhalb vom JSON keine Punkte habe und genau dafür gibt es die JSON Duality Views.

00:10:38: Es kürze sich nach einem zusätzlichen spannenden Thema an und ich denke, das werden wir wahrscheinlich noch mal weiter beleuchten müssen oder?

00:10:46: Ich denke auch.

00:10:46: Also Jason Relational Duality Views ist ein Riesenthema mit Vornachteilen und vielen kleinen Pünktchen die man beachten muss, die einem aber auch tatsächlich Das Leben erheblich erleichtert und das ist eine echte Kampfhandsage an die Object Relational Mappers aus der objektorientierten Programmierer.

00:11:03: Also, die ganzen Java-Programmiere, die heute einen Hibernate oder sowas brauchen, könnten in Zukunft einfach diese JSON Relational Duality Views verwenden und auf ihr Hibernates verzichten.

00:11:13: Das muss man denen nur beibringen – und das wäre im Sinne von Oracle natürlich!

00:11:16: Na klar… Gut … ich denke mir damit haben wir einen guten Überblick geschaffen über das Thema JSON in der Datenbank.

00:11:22: Ich kenne mich immer noch nicht damit aus aber ich will das ja auch gar nicht.

00:11:26: Ansonsten danke, Robert, dass du dir die Zeit genommen hast uns darüber in Kenntnis zu setzen.

00:11:33: Liebe Zuhörer es wäre toll wenn ihr unseren Podcast abonniert das ihr den Shownoten natürlich die Informationen findet die vielleicht ein bisschen weitergehende Literatur geben.

00:11:45: das versteht sich von selbst und ansonsten wünsche ich euch einen wunderschönen Tag.

00:11:50: Tschüss!

00:11:51: Danke auch Johannes und ich glaube über Jason werden wir noch mal reden bis denn ciao.

Neuer Kommentar

Dein Name oder Pseudonym (wird öffentlich angezeigt)
Mindestens 10 Zeichen
Durch das Abschicken des Formulars stimmst du zu, dass der Wert unter "Name oder Pseudonym" gespeichert wird und öffentlich angezeigt werden kann. Wir speichern keine IP-Adressen oder andere personenbezogene Daten. Die Nutzung deines echten Namens ist freiwillig.