TRT
Sign in
HardwareInternalsmemory

Trace: Find the Data Access That Dominates Query Cost

Database performance depends on how many rows and pages a query touches, how much data moves between operators, and whether the working set fits in memory. An index can reduce search work, but the full execution plan and actual workload determine whether that reduction matters.

The Runtime Theory Team8 min read05 steps

layer stack

Hardware

HWHardware
KKernel
RTRuntime
APPApplication
SYSSystem
CLIClient
NETNetwork
TLSCrypto
SRVServer

adjacent altitudes in this subsystem are still being traced

trace spine

  1. 01 Capture the query and workload
  2. 02 Inspect its execution plan
  3. 03 Compare estimated and actual rows
  4. 04 Count data and round trips
  5. 05 Measure the full endpoint

This trace follows the actual state transitions behind the companion Find the Data Access That Dominates Query Cost. Each step below names its concrete inputs; values illustrate the mechanism and vary across implementations.

Step 1: Capture the query and workload

Database performance depends on how many rows and pages a query touches, how much data moves between operators, and whether the working set fits in memory. An index can reduce search work, but the full execution plan and actual workload determine whether that reduction matters.

Step 2: Inspect its execution plan

An index-only scan can avoid table lookups when the requested columns are present and visibility information permits it. A cache hit can avoid storage reads, yet an application cache may return stale data or consume substantial memory. Measure buffer reads and row counts alongside elapsed time.

Step 3: Compare estimated and actual rows

An index can reduce candidate rows but still leave many table-page reads; inspect plan and buffer evidence before adding another index.

Checkpoint: An index can reduce candidate rows but still leave many table-page reads; inspect plan and buffer evidence before adding another index. Confirm this state before advancing to Count data and round trips.

Step 4: Count data and round trips

Adding indexes indiscriminately slows writes and increases maintenance. Query plans can change as statistics and data distributions change. A fast isolated query may still overload the service when multiplied by high concurrency or an N+1 request pattern.

Step 5: Measure the full endpoint

An endpoint issues one query for a list and then one query for each item. Estimate query count for 80 items and describe how batching changes network round trips and result cardinality.

The trace is done when this check holds: An endpoint issues one query for a list and then one query for each item. Compare the outcome against the companion article before making a performance claim.

Hardware, runtime, and observability notes

When tracing Trace: Find the Data Access That Dominates Query Cost in a live production environment (subsystem: memory, primary layer: hardware), keep the following step-level cost model and diagnostic checklist in mind:

  • Step 1 (hardware): Capture the query and workload — verifies state invariants before advancing the execution pointer.
  • Step 2 (hardware): Inspect its execution plan — verifies state invariants before advancing the execution pointer.
  • Step 3 (hardware): Compare estimated and actual rows — verifies state invariants before advancing the execution pointer.
  • Step 4 (hardware): Count data and round trips — verifies state invariants before advancing the execution pointer.
  • Step 5 (hardware): Measure the full endpoint — verifies state invariants before advancing the execution pointer.

Every transition across the hardware boundary carries both a direct CPU/memory cost (cache-line fills, descriptor lookups, lock acquisitions, or context switches) and a tail-latency queueing risk under contention. To verify this trace on your own service, capture latency histograms and hardware/kernel counters across each step boundary, compare cold-cache versus warm-cache execution paths, and confirm that error or timeout branches release all acquired descriptors, locks, and buffers cleanly.

Not started

Sign in to save your learning progress.

Sign in to save