Oracle Database 23ai landed in May 2024, and for the first time in a long while, Oracle shipped something that actually changes how you would design a system — not just how you would tune one. After spending time with the documentation, here is what I think matters most if you are running Oracle as part of a multi-platform DBA operation.
This is not a feature parade. I will skip the things that are incremental polish and focus on the ones that change the decision calculus.
1. AI Vector Search — Native Embeddings in the Database
This is the headline feature, and for once, Oracle did not just bolt something on. Oracle 23ai introduces a native VECTOR datatype, a VECTOR_DISTANCE() function, and HNSW / IVF index support — meaning you can store embeddings, search them, and do it inside the same transaction boundary as your relational data. No ETL to a separate vector store. No eventual consistency between your Postgres vector extension and your source of truth.
CREATE TABLE product_embeddings (\n product_id NUMBER PRIMARY KEY,\n name VARCHAR2(200),\n description VARCHAR2(2000),\n embedding VECTOR(768) -- 768-dimension float vector\n);\n\nCREATE SEARCH INDEX emb_idx ON product_embeddings(embedding)\n FOR VECTOR\n PARAMETERS (type HNSW, neighbors 16, construction 32);\n\nSELECT name, description,\n VECTOR_DISTANCE(embedding, :query_embedding, COSINE) AS score\nFROM product_embeddings\nORDER BY score\nFETCH FIRST 10 ROWS ONLY;The VECTOR_DISTANCE function supports cosine, Euclidean, and dot product. If you are already running Oracle Exadata or Autonomous Database, this makes the "should we move our vector workload to a separate Pinecone/Milvus instance" question largely moot for greenfield work.
2. JSON Relational Duality — The Most Interesting Architecture Decision in 23ai
JSON Relational Duality lets you define a single table that simultaneously behaves as structured relational rows and as JSON documents. Oracle generates a dual-access view automatically — you can query it with SQL or read it as JSON without maintaining two separate data stores.
The use case is the dual-write pattern: an application that needs to serve both a transactional workload (SQL, foreign keys, joins) and a document-oriented API against the same underlying data, without duplication or sync jobs.
CREATE JSON RELATIONAL DUALITY VIEW order_dv AS\nSELECT o.order_id, o.customer_id, o.order_date,\n o.status,\n (SELECT ROW j FROM JSON_TABLE(\n o.line_items, '