FHIR search parameters that perform well at production traffic often collapse at ten times production traffic. The performance curve is not linear; it has knees where index cache behavior, plan selection, and pool contention interact non-linearly. Designing for the ten-times case is the discipline that keeps the design decisions from becoming operational surprises.
Naming the design principles is the trick. For related walkthroughs, more FHIR implementation patterns collects the surrounding material.
Prefer Bounded Search Semantics
Bounded searches specify enough parameters to keep the result set small under any load. A search that returns twenty rows scales cleanly; a search that returns twenty thousand rows produces a Bundle assembly cost that grows with the row count.
Every hot-path search should carry a natural bound: patient ID, date range, or a discriminating category. Unbounded searches inherit the tail behavior of the widest possible result set. A pass through the site's search-query p99 lookup surfaces the tail figure per parameter type to make the boundedness concrete.
Design for the Index That Exists
Search parameters that reuse existing indexes cost nothing at design time. Search parameters that require new indexes cost storage and update overhead. A design that consistently prefers existing indexes stays cheaper than one that invents indexes per feature.
The trade is not free. Where a new index is genuinely needed, budget for it. For the covering-index framing that shapes the choice, when a covering index is a lie for FHIR JSON queries is the accompanying reference.
Materialize the Analytics Path
Analytics queries and hot-path queries have opposing performance profiles. Trying to serve both from the same search parameter set produces a compromise that fits neither. Materializing analytics results on a separate path keeps the hot-path indexes clean and the analytics latency acceptable.
Materialized views, replicated read-only tiers, and dedicated analytics stores all work. The trade is data freshness against latency stability.
Cache the Reference Data
Reference resources (CodeSystems, ValueSets, StructureDefinitions) get read constantly and change slowly. Every FHIR deployment that runs at scale ends up caching them aggressively.
Caching reference reads takes them off the hot path entirely. The remaining hot-path load is patient-scoped and workflow-scoped, and both scale more predictably. For the variance framing that motivates the caching, why the same FHIR search runs fast on Tuesday and slow on Friday covers the drivers.
Avoid the Named Patterns
The hot-path avoid list is the shortest path to the design decisions that survive the ten-times case. Multi-hop chains, :contains on long strings, wide date ranges without a filter — every one of them becomes worse at scale. For the specific patterns, FHIR search patterns you should never use in a hot path covers the list.
Test the Ten-Times Case
The single design step that separates hopeful from defensible is a load test at ten times production traffic. Every hot-path search should pass a ten-times test before it lands in production. Deployments that skip this test learn the knees the hard way.
The Documentation Habit
Design decisions that live in tribal knowledge decay when the person who authored them leaves. Design decisions in a shared document survive rotations and onboarding.
Every FHIR deployment that lands well publishes its search parameter design principles internally. Everything else is an argument that gets rehashed with every new feature.

Sources
- HL7 FHIR SearchParameter spec - HL7 FHIR SearchParameter spec, canonical reference for parameter design