datafusion-arrowmetal 0.4.1

A DataFusion 55.1 physical optimizer rule that runs full sorts, and count(*), DISTINCT and integer MIN/MAX group-bys over tables of 50M rows or more in the measured group-count ranges, on Apple silicon GPUs through ArrowMetal; hash joins, top-k and filters are available and off by default
Documentation
//! The measured aggregate table. Generated by scripts/groupby_table.py from
//! results/datafusion_groupby_sweep_2026-10-01.csv; do not edit by hand (`--check` fails when this file and that one disagree).
//! check: results/datafusion_groupby_default_2026-09-29.csv
//! check: results/datafusion_groupby_default_taken_2026-09-29.csv
//! check: results/datafusion_groupby_default_cap_2026-09-29.csv
//! check: results/datafusion_groupby_default_idle_2026-09-29.csv
//! check: results/datafusion_groupby_default_handback_2026-09-29.csv
//! check: results/datafusion_groupby_recheck_gpu_2026-09-29.csv
//! check: results/datafusion_groupby_recheck_2026-09-29.csv
//! check: results/datafusion_groupby_recheck2_2026-09-29.csv
//! check: results/datafusion_groupby_idle_vs_idle_2026-09-29.csv
//! check: results/datafusion_groupby_idle_vs_idle_recheck_2026-09-29.csv
//! check: results/datafusion_groupby_idle_gap_2026-09-29.csv
//! check: results/datafusion_groupby_idle_gaps_2026-09-29.csv
//! check: results/datafusion_groupby_idle_gaps_recheck_2026-09-29.csv
//! check: results/datafusion_groupby_resweep_check_2026-10-01.csv
//! check: results/datafusion_groupby_resweep_recheck_2026-10-01.csv
//! check: results/datafusion_groupby_default_import_2026-10-01.csv
//! check: results/datafusion_groupby_default_import_retime_2026-10-01.csv
//! check: results/datafusion_groupby_float_minmax_check_2026-10-01.csv
//! check: results/datafusion_groupby_refit_check_2026-10-02.csv
//!
//! One row per (aggregate family, key count, key class, input, group-count bucket) the sweep
//! measured: `min_rows` is the fewest input rows from which ArrowMetal was measured at least
//! MIN_RATIO x HEADROOM (1.5 x 1.1) ahead of DataFusion alone at that size and every
//! larger one (None: not taken at any size); `max_rows` caps a take whose ratio fell between the
//! two largest sizes; `ratios` is the worst ratio (both layouts, every case of the family) per size.
//! The `check:` files raise `min_rows` where the default's first run after idle is below
//! 1.0x of DataFusion alone's first run after the same idle (idle vs idle) at any of
//! 500 ms, 5000 ms, or a run-time
//! hand-back of the shape below 0.97x (best and median of rounds). Every row ends with
//! the reason for its threshold.

pub(crate) struct Row {
    pub family: &'static str,
    pub keys: &'static str,
    pub key_class: &'static str,
    pub source: &'static str,
    pub bucket: &'static str,
    pub min_rows: Option<u64>,
    pub max_rows: Option<u64>,
    pub ratios: &'static [(u64, f64)],
}

pub(crate) const SOURCE: &str = "results/datafusion_groupby_sweep_2026-10-01.csv";
pub(crate) const MIN_RATIO: f64 = 1.5;
pub(crate) const HEADROOM: f64 = 1.1;
pub(crate) const NEAR_ROWS: u64 = 4;
pub(crate) const ROWS_BUCKET: &str = "rows/2";
pub(crate) const BUCKETS: &[(&str, u64, u64)] = &[("200", 1, 1414), ("10k", 1415, 31622), ("100k", 31623, 316227), ("1M", 316228, 3162277)];

pub(crate) const TABLE: &[Row] = &[
    Row { family: "count", keys: "1", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.44), (2000000, 0.4), (5000000, 0.64), (10000000, 0.91), (50000000, 1.6)] }, // warm 1.57x at 50M, below 1.65x; not taken
    Row { family: "count", keys: "1", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.73), (2000000, 0.72), (5000000, 0.67), (10000000, 1.2), (50000000, 1.5)] }, // warm 1.52x at 50M, below 1.65x; not taken
    Row { family: "count", keys: "1", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 2.1), (5000000, 1.4), (10000000, 2.8), (50000000, 2.4)] }, // warm 1.65x or more from 10M to 50M (the ratio falls between the two largest sizes); idle vs idle not measured at 50M (count_1i32_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "count", keys: "1", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 2.2), (10000000, 1.9), (50000000, 3.4)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (count_1i32_1M part1, 5 s idle), below 1.0x; not taken
    Row { family: "count", keys: "1", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 1.4), (5000000, 1.3), (10000000, 1.9), (50000000, 0.9)] }, // warm 0.90x at 50M, below 1.65x; not taken
    Row { family: "count", keys: "1", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.4), (2000000, 0.58), (5000000, 0.67), (10000000, 0.98), (50000000, 1.3)] }, // warm 1.32x at 50M, below 1.65x; not taken
    Row { family: "count", keys: "1", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.7), (2000000, 0.7), (5000000, 0.99), (10000000, 1.1), (50000000, 1.3)] }, // warm 1.25x at 50M, below 1.65x; not taken
    Row { family: "count", keys: "1", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 2.0), (5000000, 2.2), (10000000, 2.5), (50000000, 2.5)] }, // warm 1.65x or more from 2M; idle vs idle not measured at 50M (count_1i64_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "count", keys: "1", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 2.2), (10000000, 2.7), (50000000, 3.5)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (count_1i64_1M part1, 5 s idle), below 1.0x; not taken
    Row { family: "count", keys: "1", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 1.6), (5000000, 1.8), (10000000, 1.9), (50000000, 0.89)] }, // warm 0.89x at 50M, below 1.65x; not taken
    Row { family: "count", keys: "2+", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.56), (2000000, 0.88), (5000000, 1.2), (10000000, 1.6), (50000000, 2.1)] }, // warm 1.63x at 10M, below 1.65x; not taken
    Row { family: "count", keys: "2+", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.84), (2000000, 0.93), (5000000, 1.4), (10000000, 1.8), (50000000, 2.1)] }, // warm 1.65x or more from 10M; idle vs idle 0.94x at 50M (count_2i32_10k b8192, 5 s idle), below 1.0x; not taken
    Row { family: "count", keys: "2+", key_class: "i32", source: "memory", bucket: "100k", min_rows: Some(50000000), max_rows: None, ratios: &[(1000000, 1.2), (2000000, 1.7), (5000000, 2.5), (10000000, 2.7), (50000000, 3.2)] }, // warm 1.65x or more from 2M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.81x at 10M (count_2i32_100k b8192, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "count", keys: "2+", key_class: "i32", source: "memory", bucket: "1M", min_rows: Some(50000000), max_rows: None, ratios: &[(5000000, 2.0), (10000000, 2.8), (50000000, 4.0)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.88x at 10M (count_2i32_1M part1, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "count", keys: "2+", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.1), (2000000, 1.5), (5000000, 1.9), (10000000, 2.0), (50000000, 0.9)] }, // warm 0.90x at 50M, below 1.65x; not taken
    Row { family: "count", keys: "2+", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.53), (2000000, 0.75), (5000000, 1.0), (10000000, 1.4), (50000000, 1.7)] }, // warm 1.39x at 10M, below 1.65x; not taken
    Row { family: "count", keys: "2+", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.81), (2000000, 0.91), (5000000, 1.4), (10000000, 1.6), (50000000, 1.7)] }, // warm 1.56x at 10M, below 1.65x; not taken
    Row { family: "count", keys: "2+", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.3), (2000000, 1.5), (5000000, 2.4), (10000000, 2.7), (50000000, 3.1)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (count_2i64_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "count", keys: "2+", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 2.1), (10000000, 2.8), (50000000, 3.7)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (count_2i64_1M part1, 5 s idle), below 1.0x; not taken
    Row { family: "count", keys: "2+", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 1.7), (5000000, 1.9), (10000000, 2.0), (50000000, 0.92)] }, // warm 0.92x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "1", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.48), (2000000, 0.59), (5000000, 0.87), (10000000, 1.1), (50000000, 1.5)] }, // warm 1.54x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "1", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.78), (2000000, 0.64), (5000000, 1.1), (10000000, 1.3), (50000000, 1.4)] }, // warm 1.42x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "1", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.3), (2000000, 1.5), (5000000, 2.2), (10000000, 2.8), (50000000, 2.0)] }, // warm 1.65x or more from 5M to 50M (the ratio falls between the two largest sizes); idle vs idle not measured at 50M (distinct_1i32_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "distinct", keys: "1", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 2.2), (10000000, 2.8), (50000000, 2.8)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (distinct_1i32_1M b8192, 5 s idle), below 1.0x; not taken
    Row { family: "distinct", keys: "1", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.4), (2000000, 1.5), (5000000, 2.2), (10000000, 2.1), (50000000, 0.8)] }, // warm 0.80x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "1", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.43), (2000000, 0.6), (5000000, 0.7), (10000000, 1.0), (50000000, 1.2)] }, // warm 1.20x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "1", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.74), (2000000, 0.66), (5000000, 0.94), (10000000, 1.2), (50000000, 1.3)] }, // warm 1.29x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "1", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.3), (2000000, 1.5), (5000000, 2.3), (10000000, 2.4), (50000000, 2.3)] }, // warm 1.65x or more from 5M to 50M (the ratio falls between the two largest sizes); idle vs idle not measured at 50M (distinct_1i64_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "distinct", keys: "1", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 2.4), (10000000, 2.6), (50000000, 2.7)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (distinct_1i64_1M part1, 5 s idle), below 1.0x; not taken
    Row { family: "distinct", keys: "1", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.3), (2000000, 1.4), (5000000, 2.1), (10000000, 2.1), (50000000, 0.83)] }, // warm 0.83x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "2+", key_class: "i32", source: "memory", bucket: "200", min_rows: Some(50000000), max_rows: None, ratios: &[(1000000, 0.56), (2000000, 0.86), (5000000, 1.3), (10000000, 1.7), (50000000, 2.2)] }, // warm 1.65x or more from 10M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.50x at 10M (distinct_2i32_200 part1, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "distinct", keys: "2+", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.88), (2000000, 0.98), (5000000, 1.4), (10000000, 1.8), (50000000, 2.1)] }, // warm 1.65x or more from 10M; idle vs idle 0.84x at 50M (u_small part1, 5 s idle), below 1.0x; not taken
    Row { family: "distinct", keys: "2+", key_class: "i32", source: "memory", bucket: "100k", min_rows: Some(50000000), max_rows: None, ratios: &[(1000000, 1.3), (2000000, 1.5), (5000000, 1.7), (10000000, 2.6), (50000000, 3.0)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle not measured at 10M (distinct_2i32_100k part1, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "distinct", keys: "2+", key_class: "i32", source: "memory", bucket: "1M", min_rows: Some(50000000), max_rows: None, ratios: &[(5000000, 2.1), (10000000, 2.1), (50000000, 3.4)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle not measured at 10M (distinct_2i32_1M b8192, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "distinct", keys: "2+", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 1.7), (5000000, 2.2), (10000000, 2.1), (50000000, 0.84)] }, // warm 0.84x at 50M, below 1.65x; not taken
    Row { family: "distinct", keys: "2+", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.57), (2000000, 0.77), (5000000, 1.1), (10000000, 1.5), (50000000, 1.8)] }, // warm 1.46x at 10M, below 1.65x; not taken
    Row { family: "distinct", keys: "2+", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.84), (2000000, 0.88), (5000000, 1.3), (10000000, 1.5), (50000000, 1.9)] }, // warm 1.55x at 10M, below 1.65x; not taken
    Row { family: "distinct", keys: "2+", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.3), (2000000, 1.5), (5000000, 2.5), (10000000, 2.8), (50000000, 3.2)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (distinct_2i64_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "distinct", keys: "2+", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 2.1), (10000000, 2.6), (50000000, 3.5)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (distinct_2i64_1M part1, 5 s idle), below 1.0x; not taken
    Row { family: "distinct", keys: "2+", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.3), (2000000, 1.8), (5000000, 2.1), (10000000, 2.1), (50000000, 0.86)] }, // warm 0.86x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.3), (2000000, 0.38), (5000000, 0.52), (10000000, 0.77), (50000000, 1.0)] }, // warm 1.00x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.62), (2000000, 0.68), (5000000, 0.74), (10000000, 0.95), (50000000, 0.95)] }, // warm 0.95x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.73), (2000000, 1.2), (5000000, 1.7), (10000000, 2.2), (50000000, 1.9)] }, // warm 1.65x or more from 5M to 50M (the ratio falls between the two largest sizes); idle vs idle 0.98x at 50M (minmax_f32_1i32_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 0.71), (10000000, 0.93), (50000000, 1.5)] }, // warm 1.51x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.4), (2000000, 0.44), (5000000, 0.46), (10000000, 0.5), (50000000, 0.44)] }, // warm 0.44x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.29), (2000000, 0.33), (5000000, 0.46), (10000000, 0.66), (50000000, 0.92)] }, // warm 0.92x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.62), (2000000, 0.59), (5000000, 0.74), (10000000, 0.89), (50000000, 0.89)] }, // warm 0.89x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.71), (2000000, 1.1), (5000000, 1.7), (10000000, 2.1), (50000000, 1.8)] }, // warm 1.65x or more from 5M to 50M (the ratio falls between the two largest sizes); idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.94x at 10M (minmax_f64_1i64_100k b8192, 5 s idle); hand-back minmax_f32_1i64_R2 b8192 0.974 / 0.952 (best / median) at 50M, below 0.97x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 0.71), (10000000, 1.0), (50000000, 1.6)] }, // warm 1.62x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "1", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.42), (2000000, 0.52), (5000000, 0.5), (10000000, 0.54), (50000000, 0.45)] }, // warm 0.45x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.38), (2000000, 0.45), (5000000, 0.9), (10000000, 1.3), (50000000, 1.7)] }, // warm 1.33x at 10M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.74), (2000000, 0.71), (5000000, 1.0), (10000000, 1.3), (50000000, 1.6)] }, // warm 1.56x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.78), (2000000, 1.1), (5000000, 1.6), (10000000, 2.2), (50000000, 2.5)] }, // warm 1.65x or more from 10M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.94x at 10M (minmax_f32_2i32_100k part1, 5 s idle); hand-back minmax_f64_2i32_200 part1 0.984 / 0.951 (best / median) at 50M, below 0.97x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 0.79), (10000000, 1.1), (50000000, 2.0)] }, // warm 1.13x at 10M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.42), (2000000, 0.54), (5000000, 0.51), (10000000, 0.56), (50000000, 0.46)] }, // warm 0.46x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.39), (2000000, 0.5), (5000000, 0.56), (10000000, 1.2), (50000000, 1.4)] }, // warm 1.41x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.71), (2000000, 0.64), (5000000, 1.1), (10000000, 1.3), (50000000, 1.4)] }, // warm 1.44x at 50M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.78), (2000000, 0.94), (5000000, 1.7), (10000000, 2.2), (50000000, 2.5)] }, // warm 1.65x or more from 5M; idle vs idle 0.96x at 50M (minmax_f32_2i64_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 0.84), (10000000, 1.2), (50000000, 2.0)] }, // warm 1.23x at 10M, below 1.65x; not taken
    Row { family: "minmax_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.48), (2000000, 0.57), (5000000, 0.61), (10000000, 0.6), (50000000, 0.47)] }, // warm 0.47x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.44), (2000000, 0.57), (5000000, 0.76), (10000000, 0.88), (50000000, 1.2)] }, // warm 1.17x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.64), (2000000, 0.93), (5000000, 1.0), (10000000, 1.0), (50000000, 0.94)] }, // warm 0.94x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.1), (2000000, 2.0), (5000000, 3.0), (10000000, 2.7), (50000000, 2.0)] }, // warm 1.65x or more from 2M to 50M (the ratio falls between the two largest sizes); idle vs idle 0.84x at 50M (minmax_int_1i32_100k b8192, 5 s idle), below 1.0x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 2.9), (10000000, 2.6), (50000000, 3.1)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.90x at 10M (minmax_int_1i32_1M part1, 5 s idle); hand-back minmax_int_1i32_10k part1 0.994 / 0.951 (best / median) at 50M, below 0.97x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.75), (2000000, 2.1), (5000000, 2.3), (10000000, 2.1), (50000000, 1.1)] }, // warm 1.06x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.44), (2000000, 0.59), (5000000, 0.73), (10000000, 0.77), (50000000, 1.0)] }, // warm 1.02x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.67), (2000000, 1.0), (5000000, 1.1), (10000000, 0.95), (50000000, 0.87)] }, // warm 0.87x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.4), (2000000, 1.4), (5000000, 2.8), (10000000, 2.5), (50000000, 2.1)] }, // warm 1.65x or more from 5M to 50M (the ratio falls between the two largest sizes); idle vs idle 0.80x at 50M (minmax_int_1i64_100k b8192, 5 s idle), below 1.0x; not taken
    Row { family: "minmax_int", keys: "1", key_class: "i64", source: "memory", bucket: "1M", min_rows: Some(50000000), max_rows: None, ratios: &[(5000000, 2.5), (10000000, 2.6), (50000000, 3.1)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.98x at 10M (minmax_int_1i64_1M b8192, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "minmax_int", keys: "1", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 2.1), (5000000, 2.4), (10000000, 2.2), (50000000, 1.1)] }, // warm 1.06x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "2+", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.38), (2000000, 0.69), (5000000, 1.1), (10000000, 1.4), (50000000, 1.7)] }, // warm 1.37x at 10M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "2+", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.59), (2000000, 1.2), (5000000, 1.5), (10000000, 1.4), (50000000, 1.5)] }, // warm 1.48x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "2+", key_class: "i32", source: "memory", bucket: "100k", min_rows: Some(50000000), max_rows: None, ratios: &[(1000000, 1.6), (2000000, 1.8), (5000000, 2.8), (10000000, 2.4), (50000000, 2.6)] }, // warm 1.65x or more from 2M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.96x at 10M (minmax_int_2i32_100k part1, 0.5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "minmax_int", keys: "2+", key_class: "i32", source: "memory", bucket: "1M", min_rows: Some(50000000), max_rows: None, ratios: &[(5000000, 2.8), (10000000, 2.7), (50000000, 3.4)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.94x at 10M (minmax_int_2i32_1M part1, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "minmax_int", keys: "2+", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.0), (2000000, 1.8), (5000000, 2.4), (10000000, 2.2), (50000000, 1.0)] }, // warm 1.03x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "2+", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.59), (2000000, 0.77), (5000000, 1.0), (10000000, 1.2), (50000000, 1.3)] }, // warm 1.35x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "2+", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.98), (2000000, 1.1), (5000000, 1.2), (10000000, 1.4), (50000000, 1.2)] }, // warm 1.23x at 50M, below 1.65x; not taken
    Row { family: "minmax_int", keys: "2+", key_class: "i64", source: "memory", bucket: "100k", min_rows: Some(50000000), max_rows: None, ratios: &[(1000000, 1.5), (2000000, 1.3), (5000000, 2.6), (10000000, 2.6), (50000000, 2.8)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.85x at 10M (minmax_int_2i64_100k b8192, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "minmax_int", keys: "2+", key_class: "i64", source: "memory", bucket: "1M", min_rows: Some(50000000), max_rows: None, ratios: &[(5000000, 2.5), (10000000, 2.9), (50000000, 3.4)] }, // warm 1.65x or more from 5M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.96x at 10M (minmax_int_2i64_1M part1, 5 s idle); hand-backs 0.97x or more from 50M; taken from 50M
    Row { family: "minmax_int", keys: "2+", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 1.0), (2000000, 2.0), (5000000, 2.4), (10000000, 2.3), (50000000, 1.1)] }, // warm 1.07x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.29), (2000000, 0.5), (5000000, 0.7), (10000000, 0.65), (50000000, 1.0)] }, // warm 1.02x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.42), (2000000, 0.67), (5000000, 0.84), (10000000, 0.75), (50000000, 0.77)] }, // warm 0.77x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.63), (2000000, 1.7), (5000000, 2.1), (10000000, 1.4), (50000000, 1.3)] }, // warm 1.30x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.3), (10000000, 1.4), (50000000, 1.7)] }, // warm 1.42x at 10M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.54), (2000000, 1.2), (5000000, 1.0), (10000000, 0.93), (50000000, 0.59)] }, // warm 0.59x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.21), (2000000, 0.52), (5000000, 0.62), (10000000, 0.69), (50000000, 0.89)] }, // warm 0.89x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.47), (2000000, 0.72), (5000000, 0.77), (10000000, 0.71), (50000000, 0.74)] }, // warm 0.74x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.1), (2000000, 1.2), (5000000, 1.7), (10000000, 1.5), (50000000, 1.4)] }, // warm 1.36x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.4), (10000000, 1.5), (50000000, 1.9)] }, // warm 1.51x at 10M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "1", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.33), (2000000, 1.1), (5000000, 1.0), (10000000, 0.97), (50000000, 0.63)] }, // warm 0.63x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.41), (2000000, 0.75), (5000000, 1.1), (10000000, 1.3), (50000000, 1.6)] }, // warm 1.57x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.52), (2000000, 0.55), (5000000, 1.1), (10000000, 1.3), (50000000, 1.2)] }, // warm 1.18x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.68), (2000000, 0.84), (5000000, 1.9), (10000000, 1.9), (50000000, 1.9)] }, // warm 1.65x or more from 5M to 50M (the ratio falls between the two largest sizes); idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.79x at 10M (sum_f64_2i32_100k part1, 5 s idle); hand-back sum_f64_2i32_200 part1 0.989 / 0.925 (best / median) at 50M, below 0.97x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.4), (10000000, 1.6), (50000000, 2.2)] }, // warm 1.60x at 10M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.38), (2000000, 1.1), (5000000, 1.1), (10000000, 1.1), (50000000, 0.64)] }, // warm 0.64x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.3), (2000000, 0.54), (5000000, 1.0), (10000000, 1.1), (50000000, 1.3)] }, // warm 1.28x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.66), (2000000, 0.79), (5000000, 1.1), (10000000, 1.1), (50000000, 1.0)] }, // warm 1.01x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 1.2), (2000000, 1.4), (5000000, 1.7), (10000000, 2.0), (50000000, 1.9)] }, // warm 1.65x or more from 5M to 50M (the ratio falls between the two largest sizes); idle vs idle 0.91x at 50M (sum_f64_2i64_100k b8192, 5 s idle), below 1.0x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.5), (10000000, 1.8), (50000000, 2.3)] }, // warm 1.65x or more from 10M; idle vs idle 1.0x or more at every gap from 50M; idle vs idle 0.58x at 10M (sum_f64_2i64_1M part1, 5 s idle); hand-back sum_f64_2i64_200 b8192 0.986 / 0.942 (best / median) at 50M, below 0.97x; not taken
    Row { family: "sum_avg_f64", keys: "2+", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.58), (2000000, 0.79), (5000000, 1.2), (10000000, 1.1), (50000000, 0.67)] }, // warm 0.67x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.37), (2000000, 0.51), (5000000, 0.64), (10000000, 0.69), (50000000, 1.1)] }, // warm 1.09x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.58), (2000000, 0.66), (5000000, 0.93), (10000000, 0.86), (50000000, 0.96)] }, // warm 0.96x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.98), (2000000, 1.5), (5000000, 2.1), (10000000, 1.6), (50000000, 1.5)] }, // warm 1.55x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.3), (10000000, 1.6), (50000000, 2.1)] }, // warm 1.58x at 10M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.95), (2000000, 1.1), (5000000, 1.0), (10000000, 1.0), (50000000, 0.63)] }, // warm 0.63x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.35), (2000000, 0.45), (5000000, 0.64), (10000000, 0.73), (50000000, 0.9)] }, // warm 0.90x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.58), (2000000, 0.66), (5000000, 0.82), (10000000, 0.81), (50000000, 0.94)] }, // warm 0.94x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.88), (2000000, 1.2), (5000000, 1.7), (10000000, 1.6), (50000000, 1.6)] }, // warm 1.64x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.3), (10000000, 1.6), (50000000, 2.0)] }, // warm 1.58x at 10M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "1", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.89), (2000000, 1.1), (5000000, 1.0), (10000000, 1.1), (50000000, 0.66)] }, // warm 0.66x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i32", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.51), (2000000, 0.72), (5000000, 1.2), (10000000, 1.3), (50000000, 1.5)] }, // warm 1.54x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i32", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.69), (2000000, 0.89), (5000000, 1.2), (10000000, 1.3), (50000000, 1.5)] }, // warm 1.50x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i32", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.96), (2000000, 1.6), (5000000, 1.9), (10000000, 2.1), (50000000, 2.3)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (avg_int_2i32_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i32", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.4), (10000000, 1.8), (50000000, 2.4)] }, // warm 1.65x or more from 10M; idle vs idle not measured at 50M (avg_int_2i32_1M part1, 5 s idle), below 1.0x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i32", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.94), (2000000, 1.1), (5000000, 1.2), (10000000, 1.2), (50000000, 0.66)] }, // warm 0.66x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i64", source: "memory", bucket: "200", min_rows: None, max_rows: None, ratios: &[(1000000, 0.49), (2000000, 0.65), (5000000, 0.92), (10000000, 1.1), (50000000, 1.4)] }, // warm 1.36x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i64", source: "memory", bucket: "10k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.7), (2000000, 0.81), (5000000, 1.1), (10000000, 1.2), (50000000, 1.6)] }, // warm 1.57x at 50M, below 1.65x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i64", source: "memory", bucket: "100k", min_rows: None, max_rows: None, ratios: &[(1000000, 0.99), (2000000, 1.5), (5000000, 1.8), (10000000, 2.1), (50000000, 2.4)] }, // warm 1.65x or more from 5M; idle vs idle not measured at 50M (avg_int_2i64_100k part1, 5 s idle), below 1.0x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i64", source: "memory", bucket: "1M", min_rows: None, max_rows: None, ratios: &[(5000000, 1.5), (10000000, 1.9), (50000000, 2.6)] }, // warm 1.65x or more from 10M; idle vs idle not measured at 50M (avg_int_2i64_1M part1, 5 s idle), below 1.0x; not taken
    Row { family: "sum_avg_int", keys: "2+", key_class: "i64", source: "memory", bucket: "rows/2", min_rows: None, max_rows: None, ratios: &[(1000000, 0.98), (2000000, 1.1), (5000000, 1.2), (10000000, 1.2), (50000000, 0.68)] }, // warm 0.68x at 50M, below 1.65x; not taken
];