Building an AI-Ready Oracle Database: A Production DBA Checklist

Production DBA checklist diagram for Oracle AI Database 26ai deployment covering vector infrastructure sizing, JSON Relational Duality deployment gates, and Select AI governance decisions

Three weeks before go-live on an Oracle AI Database 26ai deployment, we ran a readiness review mostly with the help of Oracle AI Database 26ai production DBA checklist.

At the surface level, things looked stable. Vector search was working in staging. JSON Relational Duality Views were serving the REST layer. Select AI was configured against a sandbox LLM endpoint.

But once we reviewed the database layer, a different picture emerged.

Vector Memory Pool was still at default. Duality views had full INSERT UPDATE DELETE access without review. The Select AI object_list included the entire schema. The network ACL was tied to a development user that would not exist in production.

None of these issues showed up in functional testing. All of them were operational risks.

This checklist comes from that gap — what works in staging versus what holds under production conditions.

Validated on: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.2.0 — Production


Area 1 — Vector Infrastructure

Vector Memory Pool — Set It Before Load Tests, Not After

HNSW indexes rely on memory-resident graph structures. That memory comes from the Vector Memory Pool.

Check the current configuration:

SELECT name,
       value
FROM   v$parameter
WHERE  name = 'vector_memory_size';

-- NAME                VALUE
-- ------------------- -----
-- vector_memory_size  0

If the value is 0, Oracle allocates memory opportunistically from the SGA. In low-load environments this may not surface immediately. Under concurrency it can show up as increased query latency, memory pressure across SGA components, and unstable performance patterns that are difficult to trace back to the root cause.

Set it explicitly before production load testing:

ALTER SYSTEM SET vector_memory_size = 8G SCOPE=BOTH;

Sizing baseline:

dimensions × 4 bytes × row_count × ~1.3 overhead

This is not exact sizing — it is a starting point for capacity planning. Adjust based on workload observations after the first load test cycle.

Verify the actual vector columns in scope before estimating:

SELECT t.table_name,
       c.column_name,
       c.data_type,
       t.num_rows,
       t.last_analyzed
FROM   user_tables  t
JOIN   user_columns c
    ON c.table_name = t.table_name
WHERE  c.data_type LIKE 'VECTOR%'
ORDER  BY t.table_name;

HNSW vs IVF — Choose Based on Constraints, Not Preference

Both index types are valid. The difference is operational behavior under production conditions.

ConditionPreferred Index
Smaller datasets, latency-sensitiveHNSW
Larger datasets, memory constrainedIVF
Frequent inserts or updatesIVF
Mostly read-heavy, static dataHNSW

Verify index type and status before go-live:

SELECT index_name,
       index_type,
       status,
       last_analyzed
FROM   user_indexes
WHERE  index_type = 'VECTOR'
ORDER  BY table_name;

-- INDEX_NAME                  INDEX_TYPE  STATUS  LAST_ANALYZED
-- --------------------------- ----------- ------- -------------------
-- VIDX_ORA_ERRORS_HNSW        VECTOR      VALID   2026-03-20 14:32:11

Avoid leaving index parameters at defaults in production. Defaults are tuned for general workloads. Production workloads have known characteristics:

-- HNSW with explicit parameters
CREATE VECTOR INDEX vidx_ora_errors_hnsw
ON ora_errors(embedding)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
WITH TARGET ACCURACY 95
PARAMETERS (type HNSW, neighbors 32, efconstruction 200);

-- IVF with explicit parameters
CREATE VECTOR INDEX vidx_ora_errors_ivf
ON ora_errors(embedding)
ORGANIZATION NEIGHBOR PARTITIONS
WITH TARGET ACCURACY 90
PARAMETERS (type IVF, neighbor partitions 64);

A VALID status with a recent last_analyzed confirms the index is built and statistics are current. A NULL last_analyzed means statistics were never gathered after creation — gather them before go-live.


Area 2 — JSON Relational Duality

Gate 1 — WITH Clause Review

Development patterns often default to full WITH INSERT UPDATE DELETE because it simplifies testing. In production that expands write access beyond what most consuming layers actually require.

Audit all duality views before deployment:

SELECT view_name,
       text
FROM   user_views
WHERE  view_name LIKE '%_DV'
ORDER  BY view_name;

Align access to actual usage for each consuming layer:

Consuming LayerWITH Clause
Reporting / read-only APIWITH READ ONLY
Status update onlyWITH UPDATE
Full record lifecycleWITH INSERT UPDATE DELETE

Full access is justified only when the consuming layer owns the complete lifecycle of those records.

Gate 2 — Lock Contention Baseline

Duality views introduce implicit locking patterns at the base table level. A write through a duality view generates standard row-level DML — which means standard row lock contention under concurrent access.

Test under realistic concurrency and check for lock wait events:

SELECT s.sid,
       s.username,
       s.event,
       s.seconds_in_wait,
       s.blocking_session
FROM   v$session s
WHERE  s.event LIKE '%row lock%'
AND    s.username IS NOT NULL
ORDER  BY s.seconds_in_wait DESC;

If contention appears during staging load tests, it will appear earlier in production. Identify the blocking pattern and address it before go-live — whether that means separating write windows, adjusting the duality view structure, or reviewing concurrent access from batch jobs on the same base tables.

Gate 3 — Lock Order Awareness

Parent-child relationships in multi-table duality views define lock acquisition order. Oracle locks parent before child, following the nesting structure in the view definition.

Risk arises when the same base tables appear in multiple duality views with different nesting orders, or when batch jobs access those tables in a different order. That combination can produce deadlocks that surface in AWR pointing at the base tables — with no obvious connection to the duality view above.

Check which base tables are shared across duality views:

SELECT v.view_name,
       d.referenced_owner,
       d.referenced_name
FROM   user_views        v
JOIN   user_dependencies d
    ON d.name = v.view_name
   AND d.type = 'VIEW'
WHERE  v.view_name LIKE '%_DV'
ORDER  BY d.referenced_name,
          v.view_name;

Any table appearing in more than one duality view should be flagged for lock order review before go-live. This is not always a problem — but it should be a known quantity, not a surprise.

Gate 4 — Statistics Freshness

New access patterns introduced by duality views require current statistics on the base tables. Stale statistics produce unstable execution plans from day one.

-- Gather statistics before go-live
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname => 'DBAVERSE',
    tabname => 'ORA_ERRORS',
    cascade => TRUE
  );
END;
/

-- Verify
SELECT table_name,
       num_rows,
       last_analyzed
FROM   user_tables
WHERE  table_name IN ('ORA_ERRORS', 'ORA_RESOLUTIONS')
ORDER  BY table_name;

-- TABLE_NAME       NUM_ROWS  LAST_ANALYZED
-- ---------------- --------- -------------------
-- ORA_ERRORS             10  2026-03-20 14:45:22
-- ORA_RESOLUTIONS        30  2026-03-20 14:45:23

last_analyzed within 24 hours of go-live is the bar we set. Anything older gets re-gathered.


Area 3 — Select AI: Governance Before Enablement

Select AI is the one area where the most important DBA work happens before the feature is enabled, not after. Once a profile is active and users are issuing natural language queries, the governance boundaries are set. Changing them mid-flight — dropping profiles, revoking ACLs, updating object lists — carries service impact risk.

Decision 1 — object_list scope. Limit to the minimum set of tables the use case requires. Avoid the schema-level wildcard entry. Review the object_list each time a new table is added to the schema — schema growth can silently expand the LLM’s view of the data model if nobody is watching.

"object_list": [
  {"owner": "DBAVERSE", "name": "ORA_ERRORS"}
]

Decision 2 — Credential ownership. Use a service account, not a personal DBA account. Define the rotation schedule upfront. DBMS_CLOUD.UPDATE_CREDENTIAL handles rotation without dropping the credential — profiles referencing the credential name continue without interruption.

Decision 3 — Network ACL alignment. The ACL grant should be tied to the schema user that owns the AI profile, not to a DBA or development account. Verify the principal matches before go-live:

SELECT host,
       principal,
       privilege
FROM   dba_host_aces
WHERE  principal = 'DBAVERSE'
ORDER  BY host;

Misaligned ACLs are one of the most common silent failure points — the profile creates without error, and the failure only appears at the first SELECT AI call.

Decision 4 — SHOWSQL discipline. Agree with the team before go-live that ad-hoc natural language queries against production-scale tables are run through SHOWSQL before RUNSQL. Generated SQL is syntactically valid. It is not always logically optimal — a missing filter on a large table is a full scan waiting to happen.

EXEC DBMS_CLOUD_AI.SET_PROFILE('DBAVERSE_OCI');
SELECT AI SHOWSQL list all critical errors in the memory category;

Consolidated Pre-Go-Live Checklist

Vector Infrastructure

  • [ ] vector_memory_size set explicitly — not left at 0
  • [ ] Index type decision documented with rationale
  • [ ] Index parameters defined — not left at defaults
  • [ ] Index status VALID with recent last_analyzed
  • [ ] Capacity estimate reviewed for vector column storage

JSON Relational Duality

  • [ ] Every duality view WITH clause reviewed against consuming layer
  • [ ] Lock contention tested under realistic concurrency
  • [ ] Multi-table lock order understood and documented
  • [ ] Base tables shared across multiple duality views identified
  • [ ] Optimizer statistics gathered within 24 hours of go-live

Select AI

  • [ ] object_list scoped to minimum required tables
  • [ ] Credential created under service account — not personal DBA account
  • [ ] Rotation schedule defined and calendared
  • [ ] Network ACL principal verified against profile owner schema user
  • [ ] SHOWSQL discipline agreed with the team and in the runbook

Closing This Pillar

The features in Oracle AI Database 26ai integrate into existing database mechanics. Indexes behave like indexes. DML behaves like DML. AWR, V$ views, execution plans — the tools remain the same.

What changes is the operational surface. There are more configuration points, and more areas where default settings are acceptable in development but insufficient under production load.

This checklist is not exhaustive. It is a starting point based on one deployment path. It will evolve as more production environments expose patterns we have not seen yet.

The other pillars in this series — Performance and AWR, RMAN and Recovery, Multitenant, and ORA-Error troubleshooting — continue from here with the same approach: what the feature actually does from a DBA’s perspective, validated on a live instance.

If you have taken any of these checklist items into your own environment and found something that needed adjusting — drop it in the comments.


All posts of this series:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.