aql-mix version 1.0.0
The seed phase builds the population. It creates 50 EHRs through the public API and commits the same composition 20 times into each, on 8 workers, leaving 1,000 compositions behind. Every later phase reads and writes against exactly that population. The phase is closed-loop: the next request goes out once the previous one has answered, so it reports bulk-load throughput and never a latency claim.
The queries phase offers arrivals on a fixed schedule: 24 a second for 60 seconds, after a 15-second warmup whose 360 arrivals are dispatched and then discarded. 1,440 arrivals are measured. They fire at their planned instants whether or not an earlier request has come back, and every latency is measured from the planned instant, so a server that stalls shows the stall in its percentiles instead of quietly receiving fewer requests.
| Operation | Request | Share | Offered | What it probes |
|---|---|---|---|---|
adhoc_query_point_lookup | POST /query/aql | 1 | 4/s | the indexed-read floor: one composition addressed by its own uid inside one EHR, the cheapest query a server can answer |
adhoc_query_ehr_scan | POST /query/aql | 1 | 4/s | the loaded-database shape: every composition in one EHR projected by uid, so the cost follows how much that EHR holds |
adhoc_query_filtered | POST /query/aql | 1 | 4/s | the value index: a systolic magnitude threshold over the observation leaves of one EHR, with the threshold drawn per arrival so no result set can be memoized |
adhoc_query_population | POST /query/aql | 1 | 4/s | the cross-EHR planner: the same magnitude threshold with no EHR scope and a fetch bound, so the server picks an access path over the whole population |
adhoc_query_aggregate | POST /query/aql | 1 | 4/s | the columnar shape: one COUNT over the population that threshold matches, which returns a single row and reads every value behind it |
adhoc_query_ordered_page | POST /query/aql | 1 | 4/s | sorting and pagination: an ORDER BY over composition start time read through a moving fetch window, the shape a paged user interface issues |
A run against this pack declares one posture profile, which says what
was switched on behind the numbers. minimal is what a run takes when it names none.
| Profile | What it switches on | Declares |
|---|---|---|
minimal default | The bare spec-conformant surface: no audit trail, unsigned versions, commits validated against the operational template, uncompressed responses, one tenant. | audit offcommit_validation templatecompression offtenancy singleversion_signing none |
The bytes it offers, and where they came from
vital_signs.opt · operational template · 217.9 KiB · application/xml
The openEHR Clinical Knowledge Manager's own Operational Template export for template id 'Vital signs' (CKM cid 1013.26.380, <https://ckm.openehr.org/ckm>), vendored byte-identically and rooted at openEHR-EHR-COMPOSITION.encounter.v1.
sha256 3a0d31bd3b5dc6329e53c0d6f22fdbaece62c684136b86139d0729cff8796128
vital_signs_composition.json · composition · 22.1 KiB · application/json
The composition attached to post 8 of the openEHR community's vital-signs benchmark thread (<https://discourse.openehr.org/t/17224>), vendored byte-identically: eight OBSERVATION entries under openEHR-EHR-COMPOSITION.encounter.v1, rm_version 1.0.2, declaring template id 'Vital signs'.
sha256 468081c259c737d35d7f80403562b3f333e479d267286faf80fd7c087eaba947
vital_signs_composition.missing_composer.json · invalid composition · 21.8 KiB · application/json
Derived in this repository from vital_signs_composition.json by deleting the mandatory COMPOSITION.composer member and nothing else, so a server that validates a commit against the reference model refuses it.
sha256 f0598db5ab447b371ead28cba0f841f72370dbbf93db98d5b8e477910a42688d
Each digest is verified when the pack loads, so a run refuses to start if a single byte of any fixture has moved. Two records that name the same pack version therefore offered the same bytes to both systems. A fixture marked invalid composition is never committed by a phase and never enters the measured population: the commit-validation canary offers it once before and once after the measured window, to see whether the server refuses it as the declared posture says it should.
The pack's own description, as every record carries it
Measures AQL query speed over the same Vital signs population the community-vitals pack seeds, so a query figure and a read figure describe the same corpus. The seed phase creates 50 EHRs and commits the same composition 20 times into each, on a pool of 8 workers. This pack version pins that population, and it is sized for query shapes: large enough that a query has to choose an access path, small enough to load before a measured window opens. The measured phase is open-loop at 24 arrivals a second for 60s after a 15s warmup, over six query classes at equal share, so each class is offered at 4 arrivals a second and every class returns the same number of samples. Each class posts one AQL statement to /query/aql, accepts only 200, and counts every other answer in its own error class, so a server that refuses one shape never contaminates another class's percentiles. Every query parameter draws from the run's seeded streams: the systolic threshold, the page offset, and the EHR or composition each arrival addresses, so no arrival repeats the previous one's result set and the whole draw is reproducible from the seed the record discloses. The six classes: adhoc_query_point_lookup probes the indexed-read floor: one composition addressed by its own uid inside one EHR, the cheapest query a server can answer; adhoc_query_ehr_scan probes the loaded-database shape: every composition in one EHR projected by uid, so the cost follows how much that EHR holds; adhoc_query_filtered probes the value index: a systolic magnitude threshold over the observation leaves of one EHR, with the threshold drawn per arrival so no result set can be memoized; adhoc_query_population probes the cross-EHR planner: the same magnitude threshold with no EHR scope and a fetch bound, so the server picks an access path over the whole population; adhoc_query_aggregate probes the columnar shape: one COUNT over the population that threshold matches, which returns a single row and reads every value behind it; adhoc_query_ordered_page probes sorting and pagination: an ORDER BY over composition start time read through a moving fetch window, the shape a paged user interface issues. Fixture provenance: the operational template is the vendored CKM export for template id 'Vital signs' (CKM cid 1013.26.380) and the composition is the attachment on post 8 of <https://discourse.openehr.org/t/17224>, both byte-identical and pinned by sha256. This pack version pins a failed-arrival ceiling of 0.01: a record in which any repetition, phase and operation loses a larger share of its arrivals, on the target or on any baseline, is not submittable, because percentiles taken over failed arrivals measure the failure rather than the system.