5M-event query benchmark
Six annual overview reports completed in 84 ms median, with a 5-million-event dataset and previous-period comparisons enabled. Filtered country and device breakdowns for GitHub traffic returned in about 13 ms median through covering rollup indexes.
These results were collected from the running dashboard on 14 October 2026. They measure browser/API response time, including response transfer and JSON parsing, in a .NET host.
5 million events
A retained, generated traffic dataset spanning 365 days.
Explore84 ms median
All six reports completed; 87 ms at the 95th percentile.
Explore13.5 ms median
Country breakdown for GitHub traffic; 14.0 ms at p95.
ExploreComplete overview
Each overview load requests traffic totals, a daily time series, top pages, sources, countries, and devices. Requests run with up to three in flight, matching the dashboard's API client.
| Report scope | All six reports: median | All six reports: p95 |
|---|---|---|
| No filter | 84.0 ms | 87.0 ms |
| source = GitHub | 60.0 ms | 62.3 ms |
| country = US | 68.5 ms | 69.7 ms |
| page = /blog | 62.2 ms | 63.8 ms |
The selected range was 1 January–31 December 2026, compared with the previous period. Every daily time series returned 365 buckets. The unfiltered current-period report contained 4,248,150 page views; the retained dataset also includes earlier traffic and custom events.
Batch time ends when all six JSON responses have been parsed. It includes waiting for a request slot and is measured separately from each request; adding individual medians does not reconstruct the batch time. Chart rendering and initial page assets are outside this measurement.
Individual report timings
Each cell below comes from 30 measured requests for that report and scope. Times are rounded to one decimal place. P95 uses the nearest-rank definition.
Unfiltered annual reports
| Report | Median | p95 |
|---|---|---|
| Traffic summary | 25.9 ms | 27.8 ms |
| Daily time series | 30.1 ms | 33.1 ms |
| Top pages | 63.6 ms | 65.7 ms |
| Sources | 32.4 ms | 34.4 ms |
| Countries | 27.2 ms | 28.0 ms |
| Devices | 26.8 ms | 27.8 ms |
GitHub traffic
Filter: source==GitHub. The selected period contained 1,805,990 page views from this source.
| Report | Median | p95 |
|---|---|---|
| Traffic summary | 43.8 ms | 46.4 ms |
| Daily time series | 46.4 ms | 48.5 ms |
| Top pages | 29.3 ms | 30.0 ms |
| Sources | 24.3 ms | 26.0 ms |
| Countries | 13.5 ms | 14.0 ms |
| Devices | 13.3 ms | 13.8 ms |
US traffic
Filter: country==US. The selected period contained 2,533,854 page views from the US.
| Report | Median | p95 |
|---|---|---|
| Traffic summary | 39.4 ms | 41.0 ms |
| Daily time series | 42.3 ms | 43.8 ms |
| Top pages | 46.3 ms | 47.7 ms |
| Sources | 24.0 ms | 25.1 ms |
| Countries | 22.7 ms | 23.4 ms |
| Devices | 21.9 ms | 22.8 ms |
Blog traffic
Filter: page==/blog. The selected period contained 1,077,885 page views for this page.
| Report | Median | p95 |
|---|---|---|
| Traffic summary | 44.9 ms | 46.7 ms |
| Daily time series | 47.6 ms | 49.7 ms |
| Top pages | 45.0 ms | 47.0 ms |
| Sources | 17.2 ms | 18.3 ms |
| Countries | 13.4 ms | 14.3 ms |
| Devices | 13.4 ms | 14.3 ms |
What the plans show
The captured plans used DayRollups throughout. Filtered multi-dimension reports additionally identified their covering index:
| Filter | Reports using a covering rollup index | IndexDimension |
|---|---|---|
| source = GitHub | Top pages, countries, devices | source |
| country = US | Top pages, sources, devices | country |
| page = /blog | Sources, countries, devices | page |
All 24 report cases returned complete plans with no warnings. All 720 measured requests succeeded.
These reports answer recurring questions from aggregate state. They do not replay five million individual events on every request. Covering indexes further narrow reads to the matching aggregate keys. This is the mechanism that keeps filtered reports interactive as event history grows.
The settings used by the dashboard include four raw dimension indexes and twelve directed rollup-index combinations:
options.Storage.DimensionIndexes.Dimensions.AddRange(
["source", "country", "device", "page"]);
options.Storage.RollupIndexes.Definitions.AddRange([
new("source", "country"), new("source", "device"), new("source", "page"),
new("country", "source"), new("country", "device"), new("country", "page"),
new("device", "source"), new("device", "country"), new("device", "page"),
new("page", "source"), new("page", "country"), new("page", "device")
]); See rollup planning and secondary indexes for matching rules, storage costs, and backfilling. Segments, funnels, and unsupported aggregate combinations can require event-level reads and have a different cost.
Workload and environment
| Setting | Recorded value |
|---|---|
| Retained input events | 5,000,000, all successfully ingested |
| Generated history | 365 days; 14 October 2025–14 October 2026 |
| Fixture | Generated website traffic with visits, sources, geography, devices, custom actions, and load-time values |
| Unfiltered group counts | 6 page paths, 6 sources, 2 countries, 2 device groups |
| Query site / calendar | benchmark-results / UTC |
| Requested range | 2026-01-01 inclusive through 2027-01-01 exclusive |
| Comparison | Previous period: the 2025 calendar year |
| Host | Windows x64, .NET 10.0.6, Debug build |
| CPU | Intel Core Ultra 7 265KF; 20 logical processors |
| Installed memory | 64 GiB |
| Browser | Chrome 155.0.8059.41, headless |
| Transport | HTTP over loopback |
| Numeric load-time percentile aggregation | Off |
The fixture spans parts of two calendar years, rather than a fully populated two-year history. Returned-row limits and the recorded group counts are part of this workload; a report over substantially more groups can require more work.
The host was already running. Storage and operating-system caches were warm; the run did not restart the engine or clear caches. Disk characteristics were not recorded. These are measured results for this workload and environment.
Measurement procedure
- Open the dashboard's latest benchmark with
range=this-year,tz=UTC, andcompare=previous-period. - Capture its six reporting URLs and confirm that they address the retained 5M dataset.
- Run each scope three times to warm it; exclude those loads and the initial navigation.
- Measure 30 further overview loads per scope, with at most three requests in flight.
- Time each request from
fetchthrough JSON parsing, after it receives a request slot. Usecache: no-store. - Record batch completion separately, calculate medians and p95, and inspect response plans.
- Verify that the retained benchmark and sample-operation state did not change during collection.
The result contains 120 measured overview loads and 720 measured requests. P95 describes request latency in this measurement; it is independent of the disabled load-time percentile aggregate.
These are representative requests with fixed dates for reproducing the recorded scope:
### Annual summary with the previous calendar-year comparison
GET http://127.0.0.1:5088/_analytics/sample-data/benchmark-api/summary?site=benchmark-results&tz=UTC&from=2026-01-01&to=2026-12-31&compare=previous-period
Accept: application/json
Cache-Control: no-cache
### Country breakdown for GitHub traffic, using the source-leading rollup index
GET http://127.0.0.1:5088/_analytics/sample-data/benchmark-api/breakdown?site=benchmark-results&tz=UTC&from=2026-01-01&to=2026-12-31&compare=previous-period&dimension=country&limit=5&includeSessionMetrics=false&filter=source%3D%3DGitHub
Accept: application/json
Cache-Control: no-cache
### Source breakdown for /blog, using the page-leading rollup index
GET http://127.0.0.1:5088/_analytics/sample-data/benchmark-api/breakdown?site=benchmark-results&tz=UTC&from=2026-01-01&to=2026-12-31&compare=previous-period&dimension=source&limit=5&includeSessionMetrics=false&filter=page%3D%3D%2Fblog
Accept: application/json
Cache-Control: no-cache The summary and time series retain their default session-metric requests. Top pages use limit=5 and includePageFlowMetrics=false. Source and country breakdowns use limit=5; devices use limit=10. All three breakdowns set includeSessionMetrics=false, matching the overview UI.
Use the raw results to inspect every request URL, timing sample, plan, and the original benchmark metadata. Use the benchmarking guide to collect another dataset under comparable conditions.
Recorded ingestion run
The retained dataset also carries the original ingestion measurement. It was not regenerated for these query measurements.
| Measurement | Recorded value |
|---|---|
| Input / successfully ingested events | 5,000,000 / 5,000,000 |
| Ingestion workers | 20 |
| Ingestion throughput | 38,542 events/s |
| Ingestion plus final flush | 129.727 s |
| Submission | 95.334 s |
| Preparation | 2.315 s |
| Errors / dropped / rejected | 0 / 0 / 0 |
| Build / GC / tiered compilation | Debug / Server / Default |
Throughput includes submission, processing, and the final flush. Preparation and the final compaction used to publish the report dataset are excluded. Submission overlaps processing and is already included in the ingestion interval.