Start here. This is the direct spoken answer to practice first.
Why this question matters
Reporting and OLTP optimize for different work. Transactional requests need short predictable operations, while reports may scan, join, sort, and aggregate large histories; sharing capacity without limits lets a useful report become a production incident.
I first define the report's freshness, date range, dimensions, frequency, expected rows, and interactive versus export use. A small selective report may run on the primary with a supporting index and strict limits. A heavy report becomes an asynchronous job with bounded concurrency and durable results. Repeated aggregates can use summary tables or a materialized read model, while broader analytics may belong on a readable replica or warehouse so normal writes and point reads keep predictable capacity.