OPTIMIZATION OBJECTIVE
Make the audit-log queries survive the table reaching one billion rows.
Optimization goal: large dataset scaling — make the query survive growth, not just pass today.
Establish why this query is expensive before changing anything. Every recommendation must trace to evidence from this query, this plan, or this schema — no generic database advice.
DATABASE CONTEXT
Platform: PostgreSQL.
- Demand EXPLAIN (ANALYZE, BUFFERS) — plain EXPLAIN cannot show actual rows, loops, or buffer traffic.
- Check bloat and statistics: dead tuples inflate scans and stale statistics mislead the planner — verify last autovacuum and analyze times.
- Reason about planner costs: default random_page_cost assumes spinning disks; on SSDs it pushes the planner away from index scans it should take.
- Use PostgreSQL's index arsenal only where evidence supports it: partial indexes for hot subsets, expression indexes for computed predicates, BRIN for huge append-only tables.
- Check parallelism: whether the plan uses workers, and whether the query shape (volatile functions, some CTEs) blocks them.
QUERY CONTEXT
Query:
```sql
[Paste the SQL query here]
```
Execution plan: not provided. Do not invent one. State the exact command to capture it — EXPLAIN (ANALYZE, BUFFERS) — and mark every plan-dependent conclusion as pending that evidence.
Tables and row counts: not provided — do not assume row counts. State the cardinality questions that block firm conclusions.
Existing indexes: not provided — do not assume any index exists. Before recommending new indexes, list what must be checked about the current ones.
PERFORMANCE SYMPTOMS
Already at 240M rows; queries degrade monthly; pagination uses OFFSET and deep pages time out.
OPTIMIZATION GOAL
Primary goal: Large Dataset Scaling.
Analysis priorities for this goal:
1. Reason at target scale: a plan that is fine at 100 thousand rows may own the server at 100 million — state the scale every conclusion assumes.
2. Identify work that grows faster than the data: join shapes that multiply, sorts that will spill, aggregates over ever-growing history.
3. Bound the working set: time-windowing, keyset pagination instead of OFFSET, and partition pruning where the platform offers it.
4. Check growth asymmetry: which tables grow and which stay constant — the right plan today may invert as the ratios change.
EVIDENCE REVIEW
Evidence mode: Standard Analysis.
- Prefer evidence from the provided query, plan, and schema; where evidence is missing, label the assumption explicitly.
- Carry at least two candidate bottlenecks until evidence separates them.
BOTTLENECK ANALYSIS
- Identify the bottlenecks and, for each: what it costs, why it matters for this workload, and the estimated share of the total cost.
- Expected analysis areas for this goal: Worse-than-linear operations; Spill risk at target volume; OFFSET pagination and unbounded scans; Partitioning and pruning opportunities.
- Distinguish the bottleneck from its symptom — a slow sort caused by a missing filter is a filter problem, not a sort problem.
OPTIMIZATION OPPORTUNITIES
- Order opportunities by expected impact, highest first; state the basis for each estimate.
- For each opportunity: the change, the expected effect, and the evidence that predicts it.
- Any query rewrite must return identical results — call out every difference in NULL handling, duplicates, and ordering, or state explicitly that there is none.
- Do not tune speculatively: a change without an evidenced problem is risk without benefit.
INDEX RECOMMENDATIONS
- Every index recommendation must name the exact predicates, joins, or sorts it serves — no index without a clause.
- Justify column order for composite indexes, and say whether the index should cover (and at what storage and write cost).
- State each index's write tax: which inserts and updates it slows, and whether the workload can afford that.
- Check existing indexes first: a near-miss index that could be extended beats a new overlapping one.
TRADEOFF ANALYSIS
- Every recommendation carries its costs: write amplification, storage, maintenance burden, plan-stability risk, staleness (for pre-aggregation).
- State when NOT to apply each recommendation — the workload shape under which it backfires.
ASSUMPTIONS
- List every assumption made about data volumes, value distributions, index state, or workload patterns.
- Mark each assumption VERIFIED (with its evidence) or UNVERIFIED (with the query or command that would resolve it).
- Any recommendation that depends on an UNVERIFIED assumption must be flagged as conditional on it.
NON-GOALS
- Do not invent execution plans.
- Do not assume indexes exist.
- Do not assume row counts.
- Do not recommend changes without justification.
- Separate facts from assumptions throughout.
- Explain the tradeoffs of every change that has them.
- Schema redesign and application-level changes are out of scope — unless the evidence shows no query-level fix exists, in which case say so and stop.
OUTPUT REQUIREMENTS
- Present recommendations as an ordered list, highest expected impact first, each with its evidence and its tradeoffs.
- For each recommendation, include the verification step: how to measure the improvement — EXPLAIN (ANALYZE, BUFFERS) before and after, on production-shaped data.
- Where essential evidence is missing, the first recommendations are the commands to gather it — not guesses in its place.
- End with the open questions: what could not be determined from the provided context, and what would settle each.