Editorial photograph of a software asset manager reviewing database usage data on screen
Oracle / Audit

Reading Oracle LMS script output. Column by column.

The collection scripts sample your database roughly once a week and write the result to CSV. Here is what each column proves, what it only suggests, and the errors to find before it leaves the building.

Contact Us Oracle Practice
500+Enterprise clients
$2B+Under advisory
Industry Recognized
500+ Enterprise Clients
$2B+ Under Advisory
11 Vendor Practices
100% Buyer Side Independent

Oracle's collection scripts read a small number of data dictionary views and write them to CSV. This guide reads those views column by column, explains what each field actually proves, and lists the error classes a SAM manager should find before the output leaves the building.

Key takeaways

  • DETECTED_USAGES counts sample windows, not events. A feature touched once for one second and a feature running all week both produce a value of 1.
  • The sampling interval defaults to 604800 seconds, one week. Every date in the view has a granularity of a week, not a moment.
  • CURRENTLY_USED is a statement about the most recent sample only. It says nothing about the audit period, and past usage still counts if a license was required at the time.
  • V$OPTION reports what is linked into the binary, not what was used. On a default Enterprise Edition install most separately licensed options read TRUE.
  • CONTROL_MANAGEMENT_PACK_ACCESS defaults to DIAGNOSTIC+TUNING on Enterprise Edition, so AWR runs automatically and Diagnostics Pack usage registers from day one.
  • Feature usage history survives cloning. A test database restored from production carries production's usage history and its original dates.
  • High water mark statistics record a peak with no date attached. One afternoon on an oversized host can set a number that follows you for years.
  • Never reset or purge the usage views before submission. That is falsification, not defense, and it destroys the only record that can also exonerate you.

Oracle's collection scripts are read only SQL. They query a handful of views, write the results to text, and prove considerably less than the formatting suggests.

The gap between what the output records and what a finding asserts is where a SAM manager earns their salary. Closing that gap is a reading exercise before it is a negotiation.

What do the Oracle collection scripts actually collect?

A defined set of data dictionary and dynamic performance views, plus host facts, exported as delimited text. Nothing is installed, nothing is modified, and nothing about your contracts is read.

Oracle's licensing function is described on its license management services page. The technical definitions of every view below are published in the Oracle Database Reference.

The sources that matter, and what each one is for

  • DBA_FEATURE_USAGE_STATISTICS. Feature and option usage history. The single most consequential source in the whole collection.
  • CDB_FEATURE_USAGE_STATISTICS. The same data per container on multitenant databases, with a CON_ID column.
  • DBA_HIGH_WATER_MARK_STATISTICS. Peak values reached for sessions, CPU count, datafiles, segment size, and similar counters.
  • V$OPTION and DBA_REGISTRY. What is linked into the binary and which components are installed.
  • V$LICENSE. Session and CPU high water marks, including core and socket counts.
  • V$INSTANCE, V$DATABASE, V$VERSION, V$PARAMETER. Identity, edition, version, and the initialization parameters that drive several of the findings.
  • DBA_USERS and DBA_ROLE_PRIVS. Account inventory, used as a proxy for Named User Plus counting.
  • Host facts. Hostname, operating system, CPU model, socket and core counts, and any virtualization signature the collector can see.

Run Oracle's own reporting script before you accept a raw dump

Oracle publishes a database options and management packs usage reporting script through My Oracle Support under Doc ID 1317265.1, available from Oracle Support with a valid support identifier.

It queries the same views but applies Oracle's own exclusion logic for known benign detections. Running it yourself, before an audit, tells you what Oracle's own filtering considers reportable rather than what a raw view dump shows.

Where the filtered report and the raw dump disagree, the difference is the argument. Document it at the time, because it is far harder to reconstruct once a finding has been drafted.

What the scripts cannot see

  • Your ordering documents, your edition entitlements, or any definition you negotiated.
  • Whether a host is production, test, training, or a decommissioned box nobody powered off.
  • Whether a database was cloned from another one, and therefore whose history it is carrying.
  • Whether a feature was configured deliberately or arrived with a template.
  • Whether a peak value lasted an afternoon or a fiscal year.

How do you read the feature usage view column by column?

Read it as a sampling record, not a usage log. Every column in DBA_FEATURE_USAGE_STATISTICS is a statement about samples, and misreading that one fact accounts for most inflated findings.

DBA_FEATURE_USAGE_STATISTICS, field by field

Column What it holds What it proves What it does not prove
DBIDDatabase identifierWhich database the row belongs toThat the database is not a copy of another one
NAMEOracle's internal feature nameWhich feature the sampler detectedWhich licensable product that feature maps to
VERSIONDatabase version at sample timeThe release the detection occurred underThat usage continued after an upgrade
DETECTED_USAGESCount of samples in which usage was seenHow many sample windows contained a detectionHow often, how long, or how much the feature ran
TOTAL_SAMPLESSamples taken for that feature and versionThe denominator for the detection rateThat every sample was equally representative
CURRENTLY_USEDTRUE or FALSE for the most recent sampleWhether the last sample saw the featureAnything about the rest of the audit period
FIRST_USAGE_DATEDate of the first sample with a detectionThe earliest window in which it was seenThe moment the feature was first used
LAST_USAGE_DATEDate of the last sample with a detectionThe most recent window with a detectionThat use stopped on that date
LAST_SAMPLE_DATEWhen the feature was last sampledThat sampling is currentThat a detection occurred
SAMPLE_INTERVALSeconds between samples, default 604800The resolution of every date in the rowAny finer timing than one week
AUX_COUNTFeature specific auxiliary countA secondary measure where the feature sets oneA licensable quantity on its own
FEATURE_INFOFeature specific detail, held as a CLOBScale: object counts, compression types, modesNothing, if you never open it. Most people do not

The sampling model, which is the whole point

A background process samples feature usage on a fixed interval, by default once a week. Each sample asks whether the feature has been exercised, and records a yes or a no.

So DETECTED_USAGES is a count of weeks, not a count of events. One accidental second inside a week and seven days of continuous production load both produce exactly the same value.

That single fact reframes most option findings. The view cannot distinguish intensity, and no amount of formatting in a report changes what the underlying counter measured.

Reading a single row in practice

Take a row for a licensable option with DETECTED_USAGES of 1, TOTAL_SAMPLES of 260, CURRENTLY_USED of FALSE, and FIRST_USAGE_DATE equal to LAST_USAGE_DATE.

That is the signature of a single touch: one detection in five years of weekly sampling, never repeated, not present now. It is a very different fact from a row showing 260 detections out of 260 samples.

Both rows can appear in a finding at the same price. Only one of them describes a deployed capability, and the distinction is visible in the raw data before anyone argues about it.

Currently used, past usage, and the honest reading

CURRENTLY_USED reports the most recent sample only. Oracle's own options and packs report renders the same underlying state as a verdict of current usage or past usage.

Past usage is not automatically free. If a license was required at the time the use occurred, the obligation existed then, and pretending otherwise is not a defensible position.

What past usage does change is the shape of the conversation. A historical detection on a known date, on a known host, is a bounded event to be priced, not a permanent capability to be licensed across the estate in perpetuity.

Version rows and container rows both accumulate

Rows exist per database, per feature, and per VERSION. An upgrade starts a new set of rows and leaves the old ones in place, so usage under 11.2.0.4 with none under 19c means it has not been seen since the upgrade.

On multitenant databases the same applies per container. Root and pluggable database rows both exist in CDB_FEATURE_USAGE_STATISTICS, and adding them together counts the same activity twice.

Summing naively across versions and containers is one of the most mechanical over counts in the entire process, and it is also one of the easiest to demonstrate.

What does the high water mark view actually prove?

It proves a peak was once reached. It does not say when, for how long, or why, and that missing context is where the largest single numbers come from.

DBA_HIGH_WATER_MARK_STATISTICS carries a NAME, a HIGHWATER value, and a LAST_VALUE. The first is the all time maximum observed, the second is the value at the most recent sample.

The comparison that tells the story

  • HIGHWATER close to LAST_VALUE. A steady state. The peak reflects normal operation.
  • HIGHWATER far above LAST_VALUE. A spike. Something happened once, and the counter never forgot it.
  • CPU_COUNT at 96 with a last value of 16. The instance once started on a host with 96 CPUs visible to it. That number, not the current one, is what appears in a finding.
  • SESSIONS high water far above steady state. Frequently a connection pool misconfiguration or a load test, not a licensing event.

V$LICENSE tells a similar story with SESSIONS_HIGHWATER and the CPU count, core count, and socket count high water columns. On a virtualized host that has since been resized, those columns are the memory of what the instance once saw.

How to contextualize a peak fairly

Pair every high water value with your own change records. A peak that coincides with a documented migration window, a hardware fault, or a one time load test is a fact with an explanation attached.

This is context, not evasion. If the peak coincides with two years of production, say so and price it. The point is that the view supplies a number and you supply the only available account of what produced it.

Why does V$OPTION list options we never bought?

Because V$OPTION reports what is linked into the Oracle binary, not what you licensed or used. On a default Enterprise Edition installation most separately licensable options read TRUE straight out of the installer.

It is an installation fact. Treating it as a usage fact, or as a licensing fact, produces findings for options that have never touched a single object in the database.

The three views and what each answers

  • V$OPTION. Could this option be used on this instance? Almost always yes on Enterprise Edition.
  • DBA_REGISTRY. Which components were installed and what state are they in?
  • DBA_FEATURE_USAGE_STATISTICS. Was anything actually exercised, and in how many sample windows?

A claim built on the first without the third is not a claim about use. Ask, in writing, which view a given line was derived from.

Unlinking, and the contract question underneath

The chopt utility shipped with the database can unlink certain options from the binary, including Partitioning, OLAP, Real Application Testing, and Advanced Analytics on 12c and 19c. After unlinking, V$OPTION reports FALSE and the code path is physically unavailable.

Before relying on that argument, read your own agreement. A small number of Oracle contracts define exposure by reference to installation as well as use, and where that language exists the V$OPTION reading matters far more.

Edition entitlements decide the rest. Which features are included in your edition and which require a separate license is set out in the database licensing information manual, and it should be the first document open beside the output.

Which error classes should you find before the output leaves?

Ten classes cover almost everything we see. Work the list before submission, because each one is far cheaper to explain with evidence now than to dispute in a position paper later.

The ten error classes, their signature, and the evidence that settles them

Error class Signature in the output Evidence that settles it
Default pack accessDiagnostics or Tuning Pack usage from database creationCONTROL_MANAGEMENT_PACK_ACCESS set to DIAGNOSTIC+TUNING by default
Console touchVery low DETECTED_USAGES on a pack, isolated dateEnterprise Manager access logs for the same window
Cloned historyUsage predating the host or the projectClone or duplicate records, DBID, database creation date
Version stackingDetections on an old VERSION, none on the current oneUpgrade date, and the per version row split
Container double countingThe same feature on root and on a pluggable databaseCON_ID breakdown from the container level view
Basic versus advanced compressionA compression row with no type detail carried forwardFEATURE_INFO contents and the edition entitlement
Cluster wide readsPer instance rows summed as if per databaseCluster topology and the GV$ view across instances
Standby and failoverUsage on a database that only ever ran as a targetRole transition records and failover dates
User account proxiesDBA_USERS counts presented as named user countsWhich accounts are service accounts and which map to people
Sample schemas and default jobsDetections tied to demonstration schemas or maintenance windowsThe job schedule and the template the database was built from

The default that causes the most findings

On Enterprise Edition, CONTROL_MANAGEMENT_PACK_ACCESS defaults to DIAGNOSTIC+TUNING. Automatic Workload Repository snapshots then run without anyone enabling them, and Diagnostics Pack usage registers from the moment the database exists.

Setting the parameter to NONE stops that happening going forward, and it is the right control on any database where the packs are not licensed. It does not erase history, and it should not be presented as if it does.

For the past, the argument is factual rather than technical: the detection arose from a shipped default, on a date matching database creation, on hosts where no performance workflow ever existed. Say it plainly and show the parameter.

Never reset the view before you submit

Oracle provides internal procedures that can refresh or clear feature usage data. Running anything that clears history before an audit submission is falsification, and it is not a grey area.

It also destroys your best evidence. The same rows that suggest a detection are the rows that show it happened once, five years ago, on a version you no longer run.

Forcing a fresh sample so the current period is up to date is a different act entirely and is legitimate. Keep the raw files unaltered, take a hash of each one, and record who produced it and when.

How should a SAM manager reconcile output to entitlement?

In three columns, per database, before anything is aggregated. Detected is what the sampler saw, reviewed is what survives an evidenced error class check, and entitled is what your ordering documents grant.

Only the gap between reviewed and entitled is worth a conversation. Aggregating across an estate before doing this at database level hides both the errors and the surplus.

A worked three column reconciliation for one database

Line Detected Reviewed Entitled Basis for the review
PartitioningYesYesYesDeliberate, in production, covered by an ordering document
Diagnostics PackYesNoNoDefault parameter, usage dated to database creation
Tuning PackYesHistorical onlyNoOne detection in 260 samples, dated, host identified
Advanced CompressionYesNoIncludedFEATURE_INFO shows basic compression, included in the edition
Real Application TestingYesNoNoDetections only on a version retired at the 19c upgrade
Active Data GuardNoNoYesSurplus entitlement, offsets shortfall in the same family

Note the final row. Surplus entitlement is as real as shortfall, it offsets within the same product family, and buyers almost never look for it because they are only searching for problems.

Counting rules live outside the output. The Oracle software investment guide sets out how Oracle expects deployments to be counted, and the processor core factor table converts cores into licensable processors.

Reconcile against those documents and your ordering documents, never against the dump. The dump has no opinion about your entitlement because it has never seen your contract.

How do you respond to an inflated finding?

With a reconciled position and documented exclusions, not with a refusal and not with the raw file. Acknowledge the collection, then answer from the reviewed column.

What the output proves, and what it merely suggests

  • It proves that a sampler recorded a detection inside a sample window, that an option is linked into the binary, and that a counter once reached a peak.
  • It suggests that someone chose to deploy a feature, that the use was in production, that it continued, and that it was at a scale worth licensing.
  • It says nothing at all about your entitlement, your edition rights, your negotiated definitions, or whether the host was ever in agreed scope.

Write the response in that order. Concede the proven, evidence the suggested, and separate out the questions the data cannot reach.

The response posture that works

  • Present detected, reviewed, and entitled as three explicit columns, per database.
  • Document every exclusion with its error class, its evidence, and its date.
  • Cite the edition entitlement and the contract definition for every line you dispute.
  • Concede clearly and early where the evidence supports the claim. Credibility on the small lines buys you the large ones.
  • Negotiate from the reviewed figure, and never from the script total.

Where the common advice on Oracle LMS output is wrong

The standard guidance is to treat the collection output as an authoritative license position and reconcile your purchases to it. We disagree. The output is a weekly sampling record, and its most important counter measures the presence of a detection in a window rather than any quantity of use. Treating it as truth hands Oracle a negotiation anchored at the worst available reading of every row. The buyer side move is to invert the burden: separate detected from reviewed from entitled, evidence each exclusion by error class, and answer only from the reviewed figure. The script is an input to a licensing conversation. It is not the conversation.

SAM manager comparing Oracle feature usage rows against a list of purchased entitlements
DETECTED_USAGES counts weeks in which something was noticed. One second of accidental use and seven days of production load produce the same number.
20 to 50%
Typical overstatement in raw output
1/3 to 2/3
Claim removed on reconciliation
30 to 40
Audit defenses benchmarked

Source: Redress Compliance advisory engagement file, 2024 to 2025.

The script tells you what the database noticed. It does not tell you what you owe. Confusing the two is the most expensive reading error in an Oracle audit.
Cover of the Redress Compliance Oracle white paper

White Paper · Oracle Database

Oracle LMS Audit Scripts

Read the audit before Oracle does. Read it free.

Read the white paper
Vera AI · 30 day free trial
Entitled, deployed, active: Vera reconciles all three.
  • Entitled vs deployed vs active seats compared, priced at your actual contract terms
  • Duplicate tools and unused capacity surfaced across the portfolio
  • A ranked savings queue with dollar values, not license counts
Try Vera AI free →30 days free · no credit card · cancel anytime

What should a buyer do next?

  1. Collect the full output and keep every raw file unaltered, with a hash and a record of who produced it and when.
  2. Run Oracle's own options and packs reporting script alongside the raw views, and keep both outputs.
  3. Split every feature usage row by VERSION and by container before anything is summed.
  4. Open FEATURE_INFO on every compression, partitioning, and pack row. Scale changes the argument.
  5. Flag every row where FIRST_USAGE_DATE matches database creation, and check the initialization parameters.
  6. Compare HIGHWATER against LAST_VALUE on every counter and pair each spike with a change record.
  7. Separate V$OPTION lines from feature usage lines, and ask which view each finding was derived from.
  8. Build the detected, reviewed, entitled reconciliation per database, including surplus entitlement.
  9. Document every exclusion with its error class, evidence, and date, before submission rather than after.
  10. Have counsel review the covering position if any material line is disputed, and respond from the reviewed figure.

A finding is a claim, not an invoice, and it is quoted at list. The full end to end process sits in the Oracle license audit guide, and the wider library is in the Oracle knowledge hub.

Need help? Try our AI agents. Ask the Oracle licensing AI agent → Scoped to one vendor and one problem. Runs in your browser.

Frequently asked questions

What does DETECTED_USAGES actually count?

It counts sample windows in which usage was detected, not individual uses. With the default weekly sampling interval, a value of 1 means the feature was noticed in exactly one week. A feature exercised once for a second and one running continuously for that week both produce the same value.

What does CURRENTLY_USED mean in an Oracle audit?

CURRENTLY_USED reports whether the feature was detected in the most recent sample only. It tells you about the last sampling window and nothing about the rest of the audit period. Oracle's own options and packs report translates the same state into a verdict of current usage or past usage.

Does past usage still require a license?

Yes, if a license was required at the time the use occurred. Past usage is not automatically free, and arguing that it is will damage your credibility. What it does change is scope: a dated detection on an identified host is a bounded event to price, not a permanent estate wide capability.

Why does V$OPTION show options we never purchased?

V$OPTION reports which options are linked into the Oracle binary, not which were licensed or used. Most separately licensable options read TRUE on a default Enterprise Edition install. The chopt utility can unlink several of them, and feature usage data, not V$OPTION, is what evidences actual use.

What is the most common Oracle LMS false positive?

Diagnostics and Tuning Pack usage arising from defaults. CONTROL_MANAGEMENT_PACK_ACCESS defaults to DIAGNOSTIC+TUNING on Enterprise Edition, so Automatic Workload Repository snapshots run without anyone enabling them and pack usage registers from database creation. A single console click produces the same effect.

Can a cloned database create a false Oracle audit finding?

Yes, routinely. Feature usage history lives in the data dictionary, so a database cloned or duplicated from production carries the source system's usage rows and original dates. A test database can show years of option usage that never happened on that host. Check creation dates against the earliest usage dates.

What does the high water mark view prove?

That a counter once reached a peak, with no date and no duration attached. A CPU count high water of 96 against a current value of 16 means the instance once saw a much larger host. Pair every peak with your change records so the number arrives with an explanation.

Should we clear the feature usage views before an audit?

No. Clearing or resetting usage history before a submission is falsification, not defense. It also destroys the evidence that shows a detection was a single event years ago on a retired version. Keep the raw files unaltered, hash them, and record who produced each one.

White Paper · Oracle Database

Reading the Oracle audit: what the LMS scripts collect.

An Oracle audit is decided by two feature usage views the database has filled in since day one. What the GLAS and LMS scripts collect, and how to read them before Oracle does.

Used across more than five hundred enterprise engagements. Independent. Buyer side. Built for procurement leaders running the next renewal cycle.

Get the white paper →
Opens the white paper landing page. We only email you about this download.
Model your Oracle exposure with our calculator in under five minutes.
Open the Tool →
3
Columns to separate
Tuning Pack
Top false positive
Edition
Changes entitlement
Used
Negotiate from this
100%
Buyer Side
Related reading

More from the Oracle Practice

Oracle Practice →
Talk to an advisor

Put a buyer side advisor on your side of the table.

We sit on your side when you negotiate with the major software publishers. Independent, benchmarked, and built for the renewal in front of you.

Contact Us
Newsletter

A SAM guide to Oracle LMS script output and the moves that follow it.

Pass it on

Know someone facing this exact decision?

Send this to whoever owns the renewal, the audit response, or the budget. It takes two clicks and it saves them a quarter of guessing.

Share on LinkedInShare by email