SAT — ABAP Runtime Analysis for Performance Tracing
SAT is the ABAP runtime analysis transaction that measures execution time, call counts, and aggregated database time for a program, transaction, function module, or RFC. It replaced the older SE30 transaction and gives a statement-level breakdown of where processing time is actually spent, distinguishing gross time (including called routines) from net time (own code only).
This page covers SAT, the ABAP runtime analysis tool used to profile where a program or transaction is spending its time. It focuses on how measurement variants distort or hide the real bottleneck, how to read gross versus net time correctly, and when SAT needs to be paired with SQL-level tracing rather than used alone.
Reviewed by an ERPClimb SAP consultant on 15 Sept 2026· 1,195 words
Purpose
SAT records the runtime behavior of ABAP code during execution: elapsed time per statement, call counts, memory use, and time spent waiting on the database, all aggregated into a hit list and a call hierarchy. The one structural fact that explains most confusion is that SAT reports two different notions of time for every entry, gross (the routine plus everything it calls) and net (the routine's own code only), and reading the wrong one routinely leads consultants to blame an innocent function module while the real cost sits three levels deeper in the call stack. SAT is the current name; older systems and documentation still reference SE30, which now simply forwards to SAT.
When it is used
SAT is reached for when a transaction, background job, or RFC call is reported as slow and the cause is not obviously a missing index or a locked resource. It sits downstream of basic monitoring: SM50 or SM66 shows something is running long, SAT explains why by breaking the runtime down by ABAP statement and call. It is used instead of an SQL trace when the suspicion is inefficient looping, redundant calls, or excessive object instantiation rather than a specific bad database access path, though in practice the two are used together. There is no Fiori app equivalent; this remains a backend development and support tool.
How to use it in practice
- Call SAT and choose the measurement object: transaction code, program, function module, or a trace request for another user or a batch job
- Select or create a measurement variant controlling aggregation level, whether table buffer calls and memory statistics are included
- Activate the trace and execute the traced transaction or job, or trigger execution directly if tracing a program
- Stop the measurement once the relevant processing step has completed
- Open the evaluation and start with the hit list sorted by gross time to locate the heaviest branch
- Drill into the call hierarchy for that branch and switch to net time to find which specific statement owns the cost
- Cross-check any DB-heavy node against a dedicated SQL trace before concluding the access path is the problem
Key data objects
- TRACE RESULT STORAGE - the raw measurement is written to a trace file identified by user, date, and time, managed internally by the tool rather than exposed as an ordinary application table
- PROGRAM AND INCLUDE REFERENCES - each hit list entry carries the program name, include, and line number so the evaluation can jump directly into the source
- CALL HIERARCHY ENTRIES - parent-child relationships between routines, function modules, and method calls that make up the call tree shown in the evaluation
- AGGREGATED DB STATISTICS - counts and elapsed time for database calls attributed to each ABAP statement, without the individual SQL text that a SQL trace would show
How to prove it in the data
SAT does not persist its results into a queryable business table, so proving a finding means staying inside the tool's own trace management list rather than SE16. Open the list of saved traces for the relevant user and time window, select the trace, and export or screenshot the hit list showing gross versus net time for the suspect routine. To corroborate the finding against reality, cross-reference the same time window in SM21 or the application log for the job, and if a specific SQL statement is implicated, rerun a parallel trace in the SQL tracing tool to get the actual statement text and access path rather than SAT's aggregated DB time.
ECC vs S/4HANA
SAT itself is unchanged on S/4HANA and continues to be the primary ABAP-side runtime profiler. What has shifted is where the bottleneck is more likely to sit: with more logic pushed into HANA views and CDS, a clean SAT result with low ABAP time can still coexist with a slow overall response if the cost is inside the database engine, so a high-DB-time node found in SAT should be followed up with database-side analysis rather than assumed to be a simple SQL tuning task. SE30 remains the legacy name and redirects to SAT.
Common pitfalls and how to diagnose them
- Measurement overhead distortion - the trace itself adds instrumentation cost, which inflates absolute times for short-running code; treat SAT's percentages and relative rankings as reliable, treat absolute millisecond values with suspicion, especially for programs running under a few hundred milliseconds unmeasured
- Gross versus net confusion - a routine with high gross time but low net time is not the culprit, it just calls something expensive; always drill down the call hierarchy until net time explains most of the gross figure before naming a suspect
- Missing SQL detail - SAT shows aggregated database time per statement but not the SQL text, table, or access path, so a high DB-time node only tells where to run a SQL trace, not what to fix; do not attempt to diagnose a missing index from SAT output alone
- Trace scope too narrow - a trace limited to the dialog step will not capture work dispatched to update tasks, background jobs, or asynchronous RFCs triggered by the traced step, producing a deceptively clean result while the real cost happens outside the measured window
- Variant hiding buffered access - depending on variant settings, calls served from table buffers may be excluded or shown as negligible, leading to the false conclusion that there is no database issue when in fact buffered access is happening at high frequency and still worth investigating
- Tracing the wrong user or session - request traces for background jobs or other users require the correct authorization and the job must still be running or configured to write a persistent trace; a common mistake is trying to trace a job that already finished with no trace request set up in advance
Whose problem this is
This is ABAP development and performance analysis territory, occasionally shared with Basis when the question is whether the slowness is code-side or infrastructure-side. A good handover includes the trace object traced, the variant used, the saved trace identifier, the specific hit list line under suspicion with its gross and net time, and whether a corresponding SQL trace was already taken for the same window.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tcodes/satERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.