DBSTATC table — DBSTATC Table Statistics Override Control
DBSTATC is a client-independent Basis table used to override the default behaviour of the database's automatic optimizer statistics collection for individual tables, for example excluding a huge table from a routine statistics refresh or forcing a specific sample size. It does not store buffering settings, execution plans, or performance history; it only holds exceptions to the default statistics job.
This page covers what DBSTATC is used for on the database layer, how to confirm whether a given table has a statistics override recorded, and the common mistake of editing it directly or reading it as a performance monitor. It also covers where responsibility for this table sits and how its relevance shifts on an SAP HANA database.
Published 20 Sept 2026· 927 words
What it stores
One row in DBSTATC represents an explicit override for how the database's automatic update-statistics job should treat a single named database table. The default assumption for every table not listed here is that it follows the standard statistics refresh cycle scheduled through the normal DBA housekeeping job. A row appears in DBSTATC only when someone has deliberately intervened, typically to exclude an extremely large or volatile table from the routine run, to pin a non-default sample size or estimation method, or to stop a statistics refresh from repeatedly triggering an expensive full scan on a table where the default settings caused problems. The table is therefore small compared to most Basis tables and is not meant to grow organically; every entry reflects a conscious tuning decision made by whoever administers the database.
Key fields
Only the table name field can be stated with confidence; the remaining columns hold the override details but their exact technical names are not asserted here to avoid guessing.
- TABNAME - name of the database table the override applies to; this is the key used for any lookup or join against this table
How it joins the data model
The only reliable join is on the table name itself, used to pull in the technical attributes of the table being overridden. Consultants confirm which application object a suspicious entry refers to and check its delivery class and buffering setting before deciding whether the override still makes sense.
- DBSTATC-TABNAME = DD02L-TABNAME
How to read it safely
The table is client-independent, so there is no client field to restrict on. It is also small enough that a full unrestricted read is not a performance risk in itself, but the useful query is always a single lookup by TABNAME rather than a scan, since the purpose of consulting the table is to answer one question: does this specific table have an override recorded or not. A blank result for a given table name is the normal case and simply means the table follows default statistics behaviour; it is not evidence of a configuration gap.
How to prove it in the data
Symptom: the cost-based optimizer keeps choosing a poor execution plan on one large table right after a scheduled statistics refresh, and someone suspects the refresh is being skipped or misconfigured for that table. Selection: look up DBSTATC restricted to that TABNAME. A row confirms an active override exists and explains why the refresh behaved differently from the default; no row means the table follows the standard job, and the plan problem has to be investigated through actual data distribution and the executed statistics run, not through this table.
ECC vs S/4HANA
The table exists in S/4HANA as part of the underlying Basis layer, but its practical weight depends on the database platform underneath. On SAP HANA, optimizer statistics are managed through HANA's own statistics service rather than through this classic override table, so DBSTATC entries carry little or no operational meaning on a HANA-based system. The table remains more relevant on non-HANA secondary databases or in historical system landscapes still running a classic anyDB. No CDS compatibility view is associated with it.
Common pitfalls
Most misreadings of DBSTATC come from treating a small, exception-only table as if it were a complete inventory or a performance dashboard.
- Assuming every table should have a row: absence is the default and correct state for the vast majority of tables, not a sign that statistics have never run
- Editing entries directly through a generic data browser instead of the proper DBA maintenance path; this can desynchronise the statistics job scheduler from what the table records and produce silent inconsistencies
- Confusing this table with table buffering configuration held in the dictionary; changing a DBSTATC override does nothing to a table's buffering behaviour and vice versa
- Reading a row here as an explanation for current bad SQL performance; the override only affects how future statistics collection runs behave, it does not retroactively fix an execution plan already cached or already compiled
- Forgetting the mechanism is tied to a specific database platform's statistics tooling; on databases where statistics are handled differently, the presence or absence of a DBSTATC row may have little or no practical effect
- Treating a stale override as still relevant after the underlying business process or data volume that justified it has changed; nobody routinely reviews these entries once they are set
Whose problem this is
This is a database administration question, owned by whoever runs the DBA housekeeping and statistics scheduling for the system, not by a functional module team. Any request to add, remove, or interpret an entry should go through that team rather than being changed ad hoc by an application consultant chasing a performance ticket.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tables/dbstatcERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.