Skip to content

Feat: add dictionaries as a supported group column type#23187

Open
Rich-T-kid wants to merge 27 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/dictionary-groupValuesColumn-impl
Open

Feat: add dictionaries as a supported group column type#23187
Rich-T-kid wants to merge 27 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/dictionary-groupValuesColumn-impl

Conversation

@Rich-T-kid

@Rich-T-kid Rich-T-kid commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

This PR introduces a specialized GroupColumn implementation for dictionary-typed columns inside GroupValuesColumn, allowing dictionary columns to participate in the columnar, vectorized aggregation path instead of the row-based fallback.

The Implementation is only about 175+ lines of code. the remaining LOC is adding extensive test at the GroupColumn trait level as well as testing the GroupValuesColumn GroupValues trait and how it inter-opts with multi-dictionary group by's.

What changes are included in this PR?

  • Adds a DictionaryGroupValueBuilder struct implementing the GroupColumn trait for Dictionary-typed group-by columns, supporting a configurable subset of value types
  • Extends the type-check gate in GroupValuesColumn::try_new (the matches! block) to accept Dictionary(_, value_type) where value_type is already supported.
  • Adds schema-level support so emitted dictionary group key columns round-trip through the output schema correctly
  • removes casting thats done for each dictionary array in emit

Are these changes tested?

yes. a majority of this PR is test

Are there any user-facing changes?

no. this is a pure perf boost for users.

@github-actions github-actions Bot added the physical-plan Changes to the physical-plan crate label Jun 25, 2026
@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/dictionary-groupValuesColumn-impl branch from 2b60132 to 1ffc7f0 Compare June 30, 2026 20:23
@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/dictionary-groupValuesColumn-impl branch from 3f7ff57 to e6b6dce Compare July 1, 2026 04:25
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@kumarUjjawal could you run the dictionary benchmarks on this PR? Thx

}
}
DataType::Dictionary(key_dt, value_dt) => {
let new_field = Field::new("", *value_dt.clone(), true);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this field is never read again it may be fine to ignore the name field.

should be weary of similar issues to #21765 (comment)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kind of annoying that make_group_column takes a field instead of a DataType. Maybe we can change that in a follow up PR?

Comment thread datafusion/physical-plan/src/aggregates/group_values/multi_group_by/dictionary.rs Outdated
@Rich-T-kid

Rich-T-kid commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

@kumarUjjawal wanted to bump this 😄

@geoffreyclaude

Copy link
Copy Markdown
Contributor

run benchmark dictionary_group_values

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4856707692-778-smmmp 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/dictionary-groupValuesColumn-impl (eb41915) to 01bf68c (merge-base) diff using: dictionary_group_values
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

group                                                                             HEAD                                   rich-T-kid_dictionary-groupValuesColumn-impl
-----                                                                             ----                                   --------------------------------------------
dict_intern_emit/intern_emit/size_65536_card_1000_null_0.00                       1.15    869.8±5.08µs 71.9 MElem/sec    1.00  756.8±139.44µs 82.6 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_20_null_0.00                         1.22    779.9±5.80µs 80.1 MElem/sec    1.00   636.7±43.49µs 98.2 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_300_null_0.00                        1.17    809.2±5.84µs 77.2 MElem/sec    1.00  692.8±108.32µs 90.2 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_65536_null_0.00                      2.45      6.3±0.01ms 10.0 MElem/sec    1.00      2.6±0.04ms 24.5 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_75_null_0.00                         1.24    800.2±6.35µs 78.1 MElem/sec    1.00    645.5±6.09µs 96.8 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_1000_null_0.00                        1.42    160.1±0.87µs 48.8 MElem/sec    1.00   112.7±15.66µs 69.3 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_20_null_0.00                          1.28    104.0±1.39µs 75.1 MElem/sec    1.00     81.5±0.45µs 95.8 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_300_null_0.00                         1.30    121.2±1.05µs 64.5 MElem/sec    1.00     92.9±9.63µs 84.1 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_75_null_0.00                          1.17    109.7±1.26µs 71.2 MElem/sec    1.00    94.1±13.82µs 83.0 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_8192_null_0.00                        2.66    678.0±2.09µs 11.5 MElem/sec    1.00   255.3±12.37µs 30.6 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_1000_null_0.10     1.04      4.4±0.02ms 57.4 MElem/sec    1.00      4.2±0.01ms 59.7 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_20_null_0.10       1.02      4.1±0.02ms 60.5 MElem/sec    1.00      4.1±0.01ms 61.5 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_300_null_0.10      1.01      4.2±0.02ms 59.2 MElem/sec    1.00      4.2±0.01ms 60.1 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_65536_null_0.10    1.54     16.5±0.05ms 15.2 MElem/sec    1.00     10.7±0.06ms 23.4 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_75_null_0.10       1.01      4.2±0.02ms 59.3 MElem/sec    1.00      4.2±0.01ms 60.2 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_1000_null_0.10      1.13    618.7±3.27µs 50.5 MElem/sec    1.00    549.9±6.40µs 56.8 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_20_null_0.10        1.00    512.1±3.06µs 61.0 MElem/sec    1.00    511.2±3.10µs 61.1 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_300_null_0.10       1.05    550.0±3.63µs 56.8 MElem/sec    1.00    522.5±2.60µs 59.8 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_75_null_0.10        1.02    526.6±2.85µs 59.3 MElem/sec    1.00    515.0±2.45µs 60.7 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_8192_null_0.10      1.74   1479.0±6.20µs 21.1 MElem/sec    1.00    847.9±5.26µs 36.9 MElem/sec

Resource Usage

dictionary_group_values — base (merge-base)

Metric Value
Wall time 380.1s
Peak memory 592.6 MiB
Avg memory 94.8 MiB
CPU user 227.9s
CPU sys 14.8s
Peak spill 0 B

dictionary_group_values — branch

Metric Value
Wall time 330.1s
Peak memory 464.6 MiB
Avg memory 67.9 MiB
CPU user 225.8s
CPU sys 19.2s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/dictionary-groupValuesColumn-impl branch from eb41915 to 770abfe Compare July 1, 2026 15:30
@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/dictionary-groupValuesColumn-impl branch from 770abfe to 243a557 Compare July 1, 2026 15:32
@Rich-T-kid Rich-T-kid changed the title [Draft][22715] introduce dictionarys as a supported group column type Feat:[Draft][22715] add dictionaries as a supported group column type Jul 1, 2026
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@codex review

@kumarUjjawal

Copy link
Copy Markdown
Contributor

@kumarUjjawal wanted to bump this 😄

@Rich-T-kid Thank you! I have been sick so I won't be available for review. I will probably get back next week.

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

I believe this PR is ready for a maintainer to take a look 👍

@kumarUjjawal

Copy link
Copy Markdown
Contributor

run benchmark dictionary_group_values

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4932335413-956-nj84w 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/dictionary-groupValuesColumn-impl (fb7856f) to 01bf68c (merge-base) diff using: dictionary_group_values
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

group                                                                             HEAD                                   rich-T-kid_dictionary-groupValuesColumn-impl
-----                                                                             ----                                   --------------------------------------------
dict_intern_emit/intern_emit/size_65536_card_1000_null_0.00                       1.10    876.4±8.31µs 71.3 MElem/sec    1.00  798.0±163.57µs 78.3 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_20_null_0.00                         1.12    789.8±8.45µs 79.1 MElem/sec    1.00  704.8±118.38µs 88.7 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_300_null_0.00                        1.08    812.8±8.52µs 76.9 MElem/sec    1.00  749.2±144.67µs 83.4 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_65536_null_0.00                      2.44      6.3±0.02ms  9.9 MElem/sec    1.00      2.6±0.05ms 24.1 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_75_null_0.00                         1.21    804.9±9.11µs 77.6 MElem/sec    1.00    667.8±7.33µs 93.6 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_1000_null_0.00                        1.32    163.6±2.46µs 47.7 MElem/sec    1.00   123.9±28.16µs 63.1 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_20_null_0.00                          1.24    106.6±2.45µs 73.3 MElem/sec    1.00     85.9±2.05µs 90.9 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_300_null_0.00                         1.29    124.6±1.96µs 62.7 MElem/sec    1.00     96.4±6.80µs 81.1 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_75_null_0.00                          1.13    112.6±1.61µs 69.4 MElem/sec    1.00    99.5±16.83µs 78.5 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_8192_null_0.00                        2.57    683.5±3.28µs 11.4 MElem/sec    1.00   265.7±26.89µs 29.4 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_1000_null_0.10     1.07      4.4±0.02ms 56.9 MElem/sec    1.00      4.1±0.01ms 60.8 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_20_null_0.10       1.03      4.2±0.03ms 59.8 MElem/sec    1.00      4.0±0.02ms 61.8 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_300_null_0.10      1.04      4.3±0.03ms 58.6 MElem/sec    1.00      4.1±0.01ms 61.0 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_65536_null_0.10    1.40     18.7±1.03ms 13.4 MElem/sec    1.00     13.4±0.65ms 18.7 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_75_null_0.10       1.04      4.3±0.03ms 58.7 MElem/sec    1.00      4.1±0.06ms 61.2 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_1000_null_0.10      1.16    623.8±3.55µs 50.1 MElem/sec    1.00    539.8±2.75µs 57.9 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_20_null_0.10        1.03    515.0±3.80µs 60.7 MElem/sec    1.00    498.5±4.00µs 62.7 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_300_null_0.10       1.07    552.0±3.58µs 56.6 MElem/sec    1.00    515.0±3.30µs 60.7 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_75_null_0.10        1.05    534.0±3.74µs 58.5 MElem/sec    1.00    507.7±3.13µs 61.5 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_8192_null_0.10      1.76   1486.4±8.77µs 21.0 MElem/sec    1.00    844.0±3.58µs 37.0 MElem/sec

Resource Usage

dictionary_group_values — base (merge-base)

Metric Value
Wall time 475.1s
Peak memory 590.0 MiB
Avg memory 77.7 MiB
CPU user 230.9s
CPU sys 15.5s
Peak spill 0 B

dictionary_group_values — branch

Metric Value
Wall time 465.1s
Peak memory 512.6 MiB
Avg memory 48.3 MiB
CPU user 222.1s
CPU sys 22.6s
Peak spill 0 B

File an issue against this benchmark runner

}
}

fn into_dict(values: ArrayRef) -> ArrayRef {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The emitted DictionaryArray uses identity keys (key[i] = i), so output is fully expanded with no value sharing. Could you add a short doc-comment explaining this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

valid_bounds is guarded with assert! which panics. A Dictionary(Int8, Utf8) column with >127 distinct groups would cause a panic in production rather than a graceful error. All other error paths here use Result. converting into_dict to -> Result and returning internal_err! on overflow, or checking bounds at intern time so build / take_n stay infallible.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

valid_bounds is guarded with assert! which panics. A Dictionary(Int8, Utf8) column with >127 distinct groups would cause a panic in production rather than a graceful error.

This is already an issue with GroupValueRows, I created this issue to track it #23127

a Dictionary(Int8, Utf8) with > 127 groups cannot be represented using the int8, this means we would be forced to bump the key type to the next support range being int16. The issue with bumping the key type is the output schema of the dictionary must match the input schema. Changing this will cause panics for downstream operators.
references : #7647

I can include a check in append_val()/vectorized_append_val() to return an error if this operation would overflow the key type.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll also add the comment to the code so that readers understand why these bounds check are running. when #23127 is closed we can remove these checks

&value_indices,
equal_to_results,
);
} else if let Some(sentinel) = Self::null_sentinel_index(dict_values) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a null key in rhs_rows is mapped to sentinel_idx inside dict_values (the batch's values array), and then passed to self.inner.vectorized_equal_to . But the null that was originally appended went through self.inner.append_val(&self.null_array, 0), a null from a different array than this batch's dict_values .

Can you confirm that all inner builder implementations (bytes, primitive, etc.) short-circuit on null equality before reading the array content so comparing "null from null_array " vs "null from dict_values [sentinel]" always returns true ?

@Rich-T-kid Rich-T-kid Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes each of the traits use nulls_equal_to() to short-circuit null array checks.

bytes.rs/180

  let exist_null = self.nulls.is_null(lhs_row);
  let input_null = array.is_null(rhs_row);
   if let Some(result) = nulls_equal_to(exist_null, input_null) {
            return result;
        }

bytes_view.rs/263

  // Check if nulls equal firstly
        if HAS_NULLS {
            let exist_null = self.nulls.is_null(lhs_row);
            let input_null = array.is_null(rhs_row);
            if let Some(result) = nulls_equal_to(exist_null, input_null) {
                return result;
            }
        }

primitive.rs/154

 // Perf: skip null check (by short circuit) if input is not nullable
        if NULLABLE {
            let exist_null = self.nulls.is_null(lhs_row);
            let input_null = array.is_null(rhs_row);
            if let Some(result) = nulls_equal_to(exist_null, input_null) {
                return result;
            }
            // Otherwise, we need to check their values
        }

boolean.rs/51

  if NULLABLE {
            let exist_null = self.nulls.is_null(lhs_row);
            let input_null = array.is_null(rhs_row);
            if let Some(result) = nulls_equal_to(exist_null, input_null) {
                return result;
            }
        }

mod.rs/116

pub fn nulls_equal_to(lhs_null: bool, rhs_null: bool) -> Option<bool> {
    match (lhs_null, rhs_null) {
        (true, true) => Some(true),
        (false, true) | (true, false) => Some(false),
        _ => None,
    }
}

since we know that rhs_null will always be true this function will always return Some(true/false) meaning further comparisons never run.

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

thanks for the review @kumarUjjawal I pushed up revisions to the PR, could you take another look 🚀

@Rich-T-kid
Rich-T-kid requested a review from kumarUjjawal July 10, 2026 15:44
kosiew pushed a commit to kosiew/datafusion that referenced this pull request Jul 11, 2026
…23280)

## Which issue does this PR close?

<!--
We generally require a GitHub issue to be filed for all bug fixes and
enhancements and this helps us generate change logs for our releases.
You can link an issue to this PR using the GitHub syntax. For example
`Closes apache#123` indicates that this PR will close issue apache#123.
-->

works towards apache#22682.

## Rationale for this change
There is a lack of testing for multi-dictionary group bys. It make sense
to introduce these test before the implementation of `Dict<K,V>` in
apache#23187
<!--
Why are you proposing this change? If this is already explained clearly
in the issue then this section is not needed.
Explaining clearly why changes are proposed helps reviewers understand
your changes and offer better suggestions for fixes.
-->

## What changes are included in this PR?
introduces a couple test
- grouping by `Dict<_,largeutf8>`
- mixing grouping by dictionarys and non dictionary columns
-  a 3-way group by where each column is `dict<_,_>`
- the test also have nulls sprinkled in to verify null handling 

<!--
There is no need to duplicate the description in the issue here but it
is sometimes worth providing a summary of the individual changes in this
PR.
-->

## Are these changes tested?
the changes are test.
<!--
We typically require tests for all PRs in order to:
1. Prevent the code from being accidentally broken by subsequent changes
2. Serve as another way to document the expected behavior of the code

If tests are not included in your PR, please explain why (for example,
are they covered by existing tests)?
-->

## Are there any user-facing changes?
no
<!--
If there are user-facing changes then we may require documentation to be
updated before approving the PR.
-->

<!--
If there are any breaking changes to public APIs, please add the `api
change` label.
-->
@kumarUjjawal

Copy link
Copy Markdown
Contributor

run benchmark dictionary_group_values

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5001762472-1124-2vwcd 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/dictionary-groupValuesColumn-impl (dc097bd) to 01bf68c (merge-base) diff using: dictionary_group_values
Results will be posted here when complete


File an issue against this benchmark runner

/// Returns an error if adding `additional` groups would overflow the key type's range.
// https://github.com/apache/datafusion/issues/23127
fn check_key_overflow(current_len: usize, additional: usize) -> Result<()> {
if !Self::valid_bounds::<K>(current_len + additional) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

check_key_overflow currently checks the dictionary key capacity against the total number of group rows. In a multi-column group-by, there can be more than 128 groups while an Int8 dictionary still has only a few distinct values. Told row path will successfully emits 129 groups with two dictionary values, while this path return will be overflow error. Could we preserve dictionary encoding during emit, or keep narrow key types on the fallback path? Please also add this as a regression test.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In a multi-column group-by, there can be more than 128 groups while an Int8 dictionary still has only a few distinct values. Told row path will successfully emits 129 groups with two dictionary values while this path return will be overflow error.

I created this test off of the main branch to test GroupValueRows

fn test_dictionary_emit_logic() {
        let schema = Arc::new(Schema::new(vec![Field::new(
            "categories",
            DataType::Dictionary(Box::new(DataType::UInt8), Box::new(DataType::Utf8)),
            false,
        )]));
        let keys: Vec<u8> = (0..1000).map(|i| (i % 255) as u8).collect();
        let values = (0..255)
            .map(|i| format!("category_{}", i))
            .collect::<Vec<_>>();

        let values_vec: Vec<Option<&str>> =
            values.iter().map(|s| Some(s.as_str())).collect();
        let values_arr = Arc::new(StringArray::from(values_vec));

        let key_array = PrimitiveArray::<UInt8Type>::from(keys);
        let dict_array = Arc::new(
            DictionaryArray::<UInt8Type>::try_new(key_array, values_arr).unwrap(),
        ) as ArrayRef;
        let mut group_values_rows =
            new_group_values(schema, &GroupOrdering::None).unwrap();
        let mut groups = Vec::new();
        group_values_rows
            .intern(&[dict_array], &mut groups)
            .unwrap();

        let size = group_values_rows.len();
        // we are now at the max valid size to represent a uint8 key
        assert_eq!(size, 255);

        // Add two more groups and verify count rises to 257
        let additional_keys: Vec<u8> = vec![0, 1];
        let additional_values = vec![Some("extra_0"), Some("extra_1")];
        let key_array = PrimitiveArray::<UInt8Type>::from(additional_keys);
        let values_arr = Arc::new(StringArray::from(additional_values));

        let additional_dict_array = Arc::new(
            DictionaryArray::<UInt8Type>::try_new(key_array, values_arr).unwrap(),
        ) as ArrayRef;

        group_values_rows
            .intern(&[additional_dict_array], &mut groups)
            .unwrap();
        let new_size = group_values_rows.len();
        assert_eq!(new_size, 257);

        let output = group_values_rows.emit(super::EmitTo::All).unwrap();
        assert_eq!(output.len(), 1);
        let output_array = &output[0];
        assert_eq!(
            output_array.data_type(),
            &DataType::Dictionary(Box::new(DataType::UInt8), Box::new(DataType::Utf8))
        );
    }

it panics on the .emit(All).unwrap call with this error

thread 'aggregates::group_values::row::test::test_dictionary_emit_logic' (51728094) panicked at datafusion/physical-plan/src/aggregates/group_values/row.rs:390:65:
called `Result::unwrap()` on an `Err` value: ArrowError(DictionaryKeyOverflowError, Some(""))

This behavior already exist in GroupValuesRows this is because of the cast the happens in the emit path. if the strings RowConverter produces cannot be cast to the input schemas dictionary key type it will just fail.

Could we preserve dictionary encoding during emit, or keep narrow key types on the fallback path? Please also add this as a regression test.

If emit::all/build is called, we need to produce every distinct value we've stored. If the number of stored values exceeds what the key type can represent, we can only emit the first key-type-sized number of outputs — e.g., if we've stored 300 distinct values but the input key type is uint8, we can only emit 255, which is logically incorrect.
This matches existing behavior, so it won't introduce a regression, but it's worth fixing properly down the line, I've opened #23127 to track it, and I'll add a regression test to document the current behavior.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually I think I understand what your refering to now. the check for key-overflow needs to be placed after we store new values in the internal GroupColumns.

so instead of

fn vectorized_append(&mut self, array: &ArrayRef, rows: &[usize]) -> Result<()> {
        let dict = array.as_dictionary::<K>();
.... write to inner groupColumn

we'd do

... write to inner groupColumn
        Self::check_key_overflow(self.inner.len(), 0)?;

now if the actually groups has exceed what we can store we'd error out here.

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

group                                                                             HEAD                                   rich-T-kid_dictionary-groupValuesColumn-impl
-----                                                                             ----                                   --------------------------------------------
dict_intern_emit/intern_emit/size_65536_card_1000_null_0.00                       1.08    867.0±6.04µs 72.1 MElem/sec    1.00  800.3±156.47µs 78.1 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_20_null_0.00                         1.24    781.3±8.72µs 80.0 MElem/sec    1.00    632.6±9.14µs 98.8 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_300_null_0.00                        1.11    808.5±7.25µs 77.3 MElem/sec    1.00  729.2±137.32µs 85.7 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_65536_null_0.00                      2.44      6.2±0.01ms 10.1 MElem/sec    1.00      2.5±0.03ms 24.7 MElem/sec
dict_intern_emit/intern_emit/size_65536_card_75_null_0.00                         1.06    799.6±5.20µs 78.2 MElem/sec    1.00  753.4±152.06µs 83.0 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_1000_null_0.00                        1.51    160.6±1.11µs 48.6 MElem/sec    1.00    106.5±0.55µs 73.4 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_20_null_0.00                          1.27    104.7±1.22µs 74.6 MElem/sec    1.00     82.3±0.74µs 95.0 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_300_null_0.00                         1.34    121.8±0.86µs 64.2 MElem/sec    1.00     90.7±0.60µs 86.1 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_75_null_0.00                          1.30    111.0±2.07µs 70.4 MElem/sec    1.00     85.2±0.66µs 91.7 MElem/sec
dict_intern_emit/intern_emit/size_8192_card_8192_null_0.00                        2.69    679.5±4.23µs 11.5 MElem/sec    1.00    252.5±2.04µs 30.9 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_1000_null_0.10     1.06      4.4±0.03ms 57.3 MElem/sec    1.00      4.1±0.03ms 60.9 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_20_null_0.10       1.04      4.1±0.02ms 60.3 MElem/sec    1.00      4.0±0.01ms 62.8 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_300_null_0.10      1.04      4.2±0.03ms 59.1 MElem/sec    1.00      4.1±0.01ms 61.3 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_65536_null_0.10    1.59     16.9±0.06ms 14.8 MElem/sec    1.00     10.6±0.05ms 23.5 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_65536_card_75_null_0.10       1.03      4.2±0.03ms 59.3 MElem/sec    1.00      4.1±0.01ms 61.1 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_1000_null_0.10      1.15    619.2±2.95µs 50.5 MElem/sec    1.00    539.6±1.67µs 57.9 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_20_null_0.10        1.03    510.9±3.02µs 61.2 MElem/sec    1.00    498.1±3.20µs 62.7 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_300_null_0.10       1.07    547.8±2.93µs 57.1 MElem/sec    1.00    511.1±2.43µs 61.1 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_75_null_0.10        1.04    529.2±3.00µs 59.1 MElem/sec    1.00    506.5±2.58µs 61.7 MElem/sec
dict_repeated_intern_emit/repeated_intern_emit/size_8192_card_8192_null_0.10      1.73   1480.1±4.82µs 21.1 MElem/sec    1.00  854.0±271.53µs 36.6 MElem/sec

Resource Usage

dictionary_group_values — base (merge-base)

Metric Value
Wall time 390.1s
Peak memory 600.5 MiB
Avg memory 92.8 MiB
CPU user 228.2s
CPU sys 14.4s
Peak spill 0 B

dictionary_group_values — branch

Metric Value
Wall time 400.1s
Peak memory 518.1 MiB
Avg memory 60.5 MiB
CPU user 223.0s
CPU sys 19.6s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/dictionary-groupValuesColumn-impl branch from 3dbb88d to aaad2c0 Compare July 17, 2026 14:47
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.66667% with 10 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (main@01bf68c). Learn more about missing BASE report.

Files with missing lines Patch % Lines
...gregates/group_values/multi_group_by/dictionary.rs 96.59% 3 Missing and 6 partials ⚠️
.../src/aggregates/group_values/multi_group_by/mod.rs 97.22% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main   #23187   +/-   ##
=======================================
  Coverage        ?   80.69%           
=======================================
  Files           ?     1087           
  Lines           ?   367086           
  Branches        ?   367086           
=======================================
  Hits            ?   296205           
  Misses          ?    53244           
  Partials        ?    17637           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@zhuqi-lucas

Copy link
Copy Markdown
Contributor

run benchmark clickbench

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5004851658-1125-clhcm 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/dictionary-groupValuesColumn-impl (aaad2c0) to 01bf68c (merge-base) diff using: clickbench
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

Benchmark for this request failed.

Last 20 lines of output:

Click to expand
# Micro-Benchmarks (specific operators and features)
cancellation:           How long cancelling a query takes
nlj:                    Benchmark for simple nested loop joins, testing various join scenarios
hj:                     Benchmark for simple hash joins, testing various join scenarios
smj:                    Benchmark for simple sort merge joins, testing various join scenarios
dict:                   Benchmark for dictionary-encoded group-by scenarios
compile_profile:        Compile and execute TPC-H across selected Cargo profiles, reporting timing and binary size


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Supported Configuration (Environment Variables)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DATA_DIR            directory to store datasets
CARGO_COMMAND       command that runs the benchmark binary
DATAFUSION_DIR      directory to use (default /workspace/datafusion-base)
RESULTS_NAME        folder where the benchmark files are stored
PREFER_HASH_JOIN    Prefer hash join algorithm (default true)
SIMULATE_LATENCY    Simulate object store latency to mimic S3 (default false)
DATAFUSION_*        Set the given datafusion configuration


File an issue against this benchmark runner

@zhuqi-lucas

Copy link
Copy Markdown
Contributor

run benchmarks

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5005039046-1127-7hns5 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/dictionary-groupValuesColumn-impl (aaad2c0) to 01bf68c (merge-base) diff using: tpcds
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5005039046-1126-vq9tx 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/dictionary-groupValuesColumn-impl (aaad2c0) to 01bf68c (merge-base) diff using: clickbench_partitioned
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5005039046-1128-pbt9m 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/dictionary-groupValuesColumn-impl (aaad2c0) to 01bf68c (merge-base) diff using: tpch
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and rich-T-kid_dictionary-groupValuesColumn-impl
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃ rich-T-kid_dictionary-groupValuesColumn-impl ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │ 38.57 / 39.73 ±1.01 / 41.54 ms │               38.33 / 38.96 ±1.06 / 41.06 ms │     no change │
│ QQuery 2  │ 19.62 / 20.09 ±0.36 / 20.72 ms │               19.47 / 19.84 ±0.40 / 20.54 ms │     no change │
│ QQuery 3  │ 31.40 / 33.73 ±1.22 / 35.04 ms │               32.27 / 33.51 ±0.67 / 34.05 ms │     no change │
│ QQuery 4  │ 17.74 / 18.02 ±0.15 / 18.14 ms │               17.65 / 18.12 ±0.72 / 19.54 ms │     no change │
│ QQuery 5  │ 38.91 / 41.05 ±1.24 / 42.79 ms │               38.14 / 39.74 ±1.29 / 41.79 ms │     no change │
│ QQuery 6  │ 16.52 / 17.22 ±0.89 / 18.94 ms │               16.40 / 16.60 ±0.17 / 16.86 ms │     no change │
│ QQuery 7  │ 45.15 / 46.86 ±1.48 / 49.08 ms │               44.33 / 45.74 ±1.34 / 47.86 ms │     no change │
│ QQuery 8  │ 43.91 / 44.63 ±0.94 / 46.46 ms │               43.72 / 44.58 ±1.54 / 47.65 ms │     no change │
│ QQuery 9  │ 49.98 / 51.45 ±0.98 / 53.05 ms │               50.16 / 51.40 ±0.73 / 52.13 ms │     no change │
│ QQuery 10 │ 42.75 / 43.94 ±0.93 / 45.12 ms │               42.36 / 42.46 ±0.06 / 42.54 ms │     no change │
│ QQuery 11 │ 13.49 / 13.93 ±0.61 / 15.13 ms │               13.55 / 14.08 ±0.68 / 15.41 ms │     no change │
│ QQuery 12 │ 23.81 / 24.32 ±0.50 / 25.27 ms │               23.94 / 24.27 ±0.28 / 24.60 ms │     no change │
│ QQuery 13 │ 32.00 / 35.14 ±1.99 / 38.23 ms │               33.60 / 35.67 ±2.12 / 38.49 ms │     no change │
│ QQuery 14 │ 24.05 / 24.16 ±0.10 / 24.33 ms │               23.97 / 24.19 ±0.13 / 24.37 ms │     no change │
│ QQuery 15 │ 31.68 / 31.91 ±0.22 / 32.22 ms │               31.17 / 31.65 ±0.31 / 32.10 ms │     no change │
│ QQuery 16 │ 14.10 / 14.48 ±0.41 / 15.26 ms │               14.02 / 14.22 ±0.16 / 14.41 ms │     no change │
│ QQuery 17 │ 90.14 / 91.36 ±1.42 / 93.11 ms │               87.48 / 88.51 ±0.78 / 89.81 ms │     no change │
│ QQuery 18 │ 65.86 / 68.81 ±1.86 / 71.60 ms │               66.42 / 68.49 ±1.36 / 70.46 ms │     no change │
│ QQuery 19 │ 33.42 / 33.62 ±0.28 / 34.17 ms │               32.73 / 33.04 ±0.30 / 33.61 ms │     no change │
│ QQuery 20 │ 34.79 / 35.15 ±0.22 / 35.37 ms │               34.25 / 34.53 ±0.22 / 34.79 ms │     no change │
│ QQuery 21 │ 56.80 / 58.64 ±2.29 / 63.13 ms │               54.72 / 56.33 ±1.14 / 57.72 ms │     no change │
│ QQuery 22 │ 14.25 / 15.19 ±1.37 / 17.86 ms │               14.06 / 14.16 ±0.11 / 14.30 ms │ +1.07x faster │
└───────────┴────────────────────────────────┴──────────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                                           ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                                           │ 803.44ms │
│ Total Time (rich-T-kid_dictionary-groupValuesColumn-impl)   │ 790.12ms │
│ Average Time (HEAD)                                         │  36.52ms │
│ Average Time (rich-T-kid_dictionary-groupValuesColumn-impl) │  35.91ms │
│ Queries Faster                                              │        1 │
│ Queries Slower                                              │        0 │
│ Queries with No Change                                      │       21 │
│ Queries with Failure                                        │        0 │
└─────────────────────────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.1 GiB
Avg memory 676.6 MiB
CPU user 23.7s
CPU sys 1.7s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.1 GiB
Avg memory 497.3 MiB
CPU user 23.4s
CPU sys 1.6s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and rich-T-kid_dictionary-groupValuesColumn-impl
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                  HEAD ┃ rich-T-kid_dictionary-groupValuesColumn-impl ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │           5.74 / 6.20 ±0.85 / 7.91 ms │                  5.65 / 6.14 ±0.79 / 7.72 ms │     no change │
│ QQuery 2  │        81.24 / 81.43 ±0.13 / 81.65 ms │               82.57 / 82.74 ±0.15 / 82.99 ms │     no change │
│ QQuery 3  │        29.89 / 30.12 ±0.23 / 30.55 ms │               29.65 / 30.07 ±0.26 / 30.47 ms │     no change │
│ QQuery 4  │     502.21 / 509.77 ±5.29 / 517.51 ms │            501.19 / 511.42 ±8.15 / 523.81 ms │     no change │
│ QQuery 5  │        52.88 / 53.28 ±0.23 / 53.51 ms │               52.57 / 52.86 ±0.21 / 53.19 ms │     no change │
│ QQuery 6  │        37.19 / 37.59 ±0.27 / 37.98 ms │               36.85 / 37.36 ±0.32 / 37.79 ms │     no change │
│ QQuery 7  │        95.13 / 96.27 ±1.00 / 98.09 ms │              95.44 / 97.67 ±3.23 / 104.06 ms │     no change │
│ QQuery 8  │        37.10 / 37.66 ±0.66 / 38.72 ms │               37.50 / 37.79 ±0.38 / 38.55 ms │     no change │
│ QQuery 9  │        52.32 / 56.02 ±2.12 / 58.29 ms │               53.02 / 55.02 ±1.44 / 57.18 ms │     no change │
│ QQuery 10 │        63.69 / 64.44 ±0.38 / 64.68 ms │               64.03 / 64.33 ±0.34 / 64.87 ms │     no change │
│ QQuery 11 │     309.39 / 314.17 ±3.77 / 318.86 ms │            316.28 / 319.02 ±3.38 / 325.40 ms │     no change │
│ QQuery 12 │        28.90 / 29.26 ±0.28 / 29.74 ms │               29.06 / 29.92 ±0.55 / 30.59 ms │     no change │
│ QQuery 13 │     119.22 / 120.92 ±1.17 / 122.75 ms │            119.20 / 121.12 ±1.01 / 122.04 ms │     no change │
│ QQuery 14 │     421.03 / 424.99 ±4.52 / 432.52 ms │            417.73 / 424.59 ±5.21 / 432.39 ms │     no change │
│ QQuery 15 │        58.47 / 59.26 ±0.67 / 60.36 ms │               58.72 / 59.37 ±0.76 / 60.83 ms │     no change │
│ QQuery 16 │           6.95 / 7.17 ±0.20 / 7.54 ms │                  6.84 / 7.00 ±0.15 / 7.29 ms │     no change │
│ QQuery 17 │        81.42 / 84.20 ±2.85 / 88.77 ms │               81.84 / 83.44 ±1.37 / 85.42 ms │     no change │
│ QQuery 18 │     126.29 / 126.99 ±0.60 / 127.98 ms │            125.14 / 126.17 ±0.58 / 126.94 ms │     no change │
│ QQuery 19 │        41.99 / 42.35 ±0.40 / 43.09 ms │               42.25 / 42.71 ±0.54 / 43.68 ms │     no change │
│ QQuery 20 │        36.47 / 37.17 ±0.98 / 39.12 ms │               37.65 / 38.50 ±0.81 / 39.67 ms │     no change │
│ QQuery 21 │        17.80 / 18.18 ±0.23 / 18.42 ms │               18.06 / 18.27 ±0.14 / 18.50 ms │     no change │
│ QQuery 22 │        62.55 / 63.97 ±1.17 / 65.70 ms │               63.16 / 64.89 ±1.35 / 67.24 ms │     no change │
│ QQuery 23 │     360.34 / 366.38 ±5.70 / 374.90 ms │            367.17 / 372.87 ±4.27 / 376.88 ms │     no change │
│ QQuery 24 │     228.45 / 232.71 ±3.45 / 238.70 ms │            227.97 / 232.08 ±4.99 / 241.14 ms │     no change │
│ QQuery 25 │     111.85 / 113.54 ±1.70 / 115.97 ms │            112.96 / 114.81 ±1.83 / 118.14 ms │     no change │
│ QQuery 26 │        58.46 / 59.13 ±0.52 / 59.90 ms │               58.33 / 58.98 ±0.46 / 59.64 ms │     no change │
│ QQuery 27 │           6.56 / 6.66 ±0.14 / 6.95 ms │                  6.47 / 6.61 ±0.20 / 7.01 ms │     no change │
│ QQuery 28 │        61.24 / 62.07 ±0.62 / 62.99 ms │               60.75 / 61.55 ±0.47 / 62.21 ms │     no change │
│ QQuery 29 │      99.34 / 102.00 ±2.55 / 106.51 ms │             99.29 / 102.74 ±3.77 / 109.61 ms │     no change │
│ QQuery 30 │        32.94 / 33.15 ±0.29 / 33.72 ms │               32.98 / 33.48 ±0.41 / 34.09 ms │     no change │
│ QQuery 31 │     112.77 / 113.98 ±0.74 / 115.07 ms │            113.07 / 114.25 ±1.23 / 116.30 ms │     no change │
│ QQuery 32 │        21.28 / 23.86 ±3.50 / 30.65 ms │               21.45 / 22.38 ±1.14 / 24.62 ms │ +1.07x faster │
│ QQuery 33 │        38.68 / 39.46 ±0.50 / 40.18 ms │               38.42 / 39.07 ±0.56 / 39.91 ms │     no change │
│ QQuery 34 │        10.05 / 10.42 ±0.25 / 10.79 ms │               10.09 / 10.41 ±0.33 / 10.99 ms │     no change │
│ QQuery 35 │        73.65 / 74.35 ±0.56 / 75.31 ms │               73.55 / 74.28 ±0.45 / 74.85 ms │     no change │
│ QQuery 36 │           6.08 / 6.19 ±0.19 / 6.56 ms │                  5.98 / 6.14 ±0.15 / 6.43 ms │     no change │
│ QQuery 37 │           7.26 / 7.29 ±0.03 / 7.33 ms │                  7.21 / 7.32 ±0.13 / 7.55 ms │     no change │
│ QQuery 38 │        65.04 / 67.37 ±3.18 / 73.22 ms │               65.48 / 66.91 ±2.08 / 71.02 ms │     no change │
│ QQuery 39 │        88.08 / 89.17 ±0.85 / 90.48 ms │               86.90 / 87.81 ±0.71 / 89.01 ms │     no change │
│ QQuery 40 │        23.66 / 24.05 ±0.23 / 24.35 ms │               23.94 / 24.22 ±0.39 / 24.99 ms │     no change │
│ QQuery 41 │        11.57 / 11.75 ±0.16 / 12.05 ms │               11.60 / 11.82 ±0.25 / 12.31 ms │     no change │
│ QQuery 42 │        24.53 / 24.91 ±0.19 / 25.04 ms │               24.20 / 24.67 ±0.32 / 25.07 ms │     no change │
│ QQuery 43 │           4.98 / 5.08 ±0.16 / 5.39 ms │                  4.99 / 5.21 ±0.17 / 5.37 ms │     no change │
│ QQuery 44 │           9.44 / 9.55 ±0.10 / 9.74 ms │                9.76 / 10.00 ±0.26 / 10.39 ms │     no change │
│ QQuery 45 │        39.72 / 42.09 ±2.28 / 46.07 ms │               40.37 / 42.69 ±2.29 / 46.94 ms │     no change │
│ QQuery 46 │        12.04 / 12.59 ±0.42 / 13.07 ms │               11.97 / 12.53 ±0.41 / 13.16 ms │     no change │
│ QQuery 47 │     238.24 / 244.44 ±5.40 / 252.53 ms │            237.08 / 244.44 ±6.13 / 254.76 ms │     no change │
│ QQuery 48 │        96.24 / 97.13 ±0.72 / 98.40 ms │               97.11 / 97.48 ±0.55 / 98.57 ms │     no change │
│ QQuery 49 │        78.16 / 81.06 ±2.04 / 84.32 ms │               78.18 / 81.10 ±2.58 / 84.53 ms │     no change │
│ QQuery 50 │        59.46 / 60.30 ±0.51 / 60.87 ms │               59.32 / 60.07 ±0.65 / 61.13 ms │     no change │
│ QQuery 51 │     100.40 / 101.95 ±0.81 / 102.66 ms │             98.54 / 102.34 ±2.86 / 107.33 ms │     no change │
│ QQuery 52 │        24.49 / 24.88 ±0.29 / 25.36 ms │               24.35 / 24.75 ±0.26 / 25.05 ms │     no change │
│ QQuery 53 │        30.10 / 30.46 ±0.28 / 30.91 ms │               30.31 / 30.51 ±0.15 / 30.73 ms │     no change │
│ QQuery 54 │        56.64 / 57.25 ±0.45 / 57.93 ms │               56.23 / 56.69 ±0.51 / 57.56 ms │     no change │
│ QQuery 55 │        23.76 / 24.05 ±0.36 / 24.75 ms │               23.52 / 23.97 ±0.32 / 24.52 ms │     no change │
│ QQuery 56 │        39.94 / 40.33 ±0.38 / 41.06 ms │               39.84 / 40.59 ±1.29 / 43.16 ms │     no change │
│ QQuery 57 │     182.34 / 183.83 ±1.35 / 186.07 ms │            182.05 / 183.55 ±2.00 / 187.38 ms │     no change │
│ QQuery 58 │     117.13 / 120.18 ±2.77 / 124.99 ms │            118.31 / 120.34 ±1.38 / 121.92 ms │     no change │
│ QQuery 59 │     118.83 / 120.43 ±2.97 / 126.36 ms │            119.02 / 120.92 ±1.50 / 123.12 ms │     no change │
│ QQuery 60 │        40.14 / 41.12 ±0.88 / 42.25 ms │               39.93 / 40.59 ±0.37 / 40.90 ms │     no change │
│ QQuery 61 │        12.63 / 12.79 ±0.21 / 13.19 ms │               12.55 / 12.71 ±0.19 / 13.08 ms │     no change │
│ QQuery 62 │        47.04 / 47.39 ±0.22 / 47.64 ms │               47.51 / 47.80 ±0.29 / 48.31 ms │     no change │
│ QQuery 63 │        30.28 / 30.65 ±0.27 / 30.99 ms │               30.29 / 30.43 ±0.13 / 30.61 ms │     no change │
│ QQuery 64 │     416.48 / 420.00 ±2.51 / 422.74 ms │            414.18 / 420.37 ±4.12 / 424.63 ms │     no change │
│ QQuery 65 │     151.66 / 154.70 ±1.91 / 157.34 ms │            154.28 / 157.11 ±2.61 / 161.72 ms │     no change │
│ QQuery 66 │        80.41 / 81.64 ±0.85 / 82.88 ms │               81.09 / 85.03 ±5.75 / 96.42 ms │     no change │
│ QQuery 67 │     247.71 / 252.54 ±4.36 / 259.23 ms │            248.35 / 255.24 ±5.59 / 262.78 ms │     no change │
│ QQuery 68 │        11.95 / 12.25 ±0.23 / 12.60 ms │               12.27 / 12.37 ±0.10 / 12.54 ms │     no change │
│ QQuery 69 │        58.17 / 58.94 ±0.57 / 59.75 ms │               57.97 / 58.41 ±0.27 / 58.72 ms │     no change │
│ QQuery 70 │     105.95 / 110.58 ±7.70 / 125.85 ms │           106.02 / 113.62 ±10.79 / 134.05 ms │     no change │
│ QQuery 71 │        36.12 / 37.15 ±1.20 / 39.43 ms │               35.66 / 36.53 ±0.56 / 37.14 ms │     no change │
│ QQuery 72 │ 2110.08 / 2233.62 ±72.08 / 2326.40 ms │        2231.09 / 2281.35 ±40.56 / 2331.89 ms │     no change │
│ QQuery 73 │          9.79 / 9.97 ±0.21 / 10.37 ms │                9.94 / 10.15 ±0.18 / 10.45 ms │     no change │
│ QQuery 74 │     175.88 / 177.97 ±1.19 / 179.29 ms │            176.01 / 182.08 ±7.27 / 196.33 ms │     no change │
│ QQuery 75 │     151.68 / 154.64 ±3.75 / 161.99 ms │            153.06 / 153.71 ±0.52 / 154.29 ms │     no change │
│ QQuery 76 │        36.22 / 36.62 ±0.29 / 37.02 ms │               35.95 / 36.69 ±0.50 / 37.42 ms │     no change │
│ QQuery 77 │        62.05 / 62.81 ±0.43 / 63.24 ms │               61.96 / 63.89 ±2.79 / 69.42 ms │     no change │
│ QQuery 78 │     186.63 / 190.67 ±3.54 / 196.98 ms │            188.95 / 194.41 ±6.34 / 206.70 ms │     no change │
│ QQuery 79 │        68.03 / 69.79 ±3.01 / 75.80 ms │               68.68 / 71.32 ±2.01 / 74.71 ms │     no change │
│ QQuery 80 │     100.52 / 101.44 ±0.81 / 102.93 ms │            101.62 / 102.49 ±0.69 / 103.33 ms │     no change │
│ QQuery 81 │        26.21 / 26.37 ±0.14 / 26.58 ms │               26.43 / 26.59 ±0.17 / 26.82 ms │     no change │
│ QQuery 82 │        16.82 / 17.02 ±0.14 / 17.16 ms │               17.57 / 22.96 ±6.55 / 35.20 ms │  1.35x slower │
│ QQuery 83 │        41.19 / 41.81 ±0.40 / 42.30 ms │               42.14 / 42.61 ±0.29 / 43.04 ms │     no change │
│ QQuery 84 │        31.01 / 32.94 ±3.12 / 39.15 ms │               31.55 / 32.21 ±0.40 / 32.66 ms │     no change │
│ QQuery 85 │     107.12 / 108.77 ±1.05 / 110.41 ms │            110.43 / 112.80 ±3.83 / 120.40 ms │     no change │
│ QQuery 86 │        25.50 / 26.07 ±0.38 / 26.58 ms │               26.83 / 27.89 ±0.73 / 28.99 ms │  1.07x slower │
│ QQuery 87 │        65.02 / 65.88 ±0.76 / 67.31 ms │               67.04 / 67.77 ±0.92 / 69.55 ms │     no change │
│ QQuery 88 │        64.41 / 65.18 ±0.77 / 66.66 ms │               65.16 / 65.57 ±0.31 / 65.93 ms │     no change │
│ QQuery 89 │        36.37 / 36.78 ±0.48 / 37.70 ms │               36.66 / 37.13 ±0.27 / 37.47 ms │     no change │
│ QQuery 90 │        17.48 / 17.71 ±0.18 / 17.89 ms │               18.23 / 20.78 ±4.78 / 30.34 ms │  1.17x slower │
│ QQuery 91 │        46.38 / 46.82 ±0.39 / 47.41 ms │               47.77 / 49.06 ±0.68 / 49.67 ms │     no change │
│ QQuery 92 │        30.86 / 33.37 ±3.80 / 40.93 ms │               31.37 / 31.79 ±0.21 / 31.92 ms │     no change │
│ QQuery 93 │        50.43 / 51.93 ±1.29 / 54.28 ms │               51.08 / 51.62 ±0.36 / 52.16 ms │     no change │
│ QQuery 94 │        39.53 / 39.77 ±0.25 / 40.26 ms │               39.08 / 39.64 ±0.53 / 40.59 ms │     no change │
│ QQuery 95 │        83.03 / 83.32 ±0.31 / 83.89 ms │               83.28 / 85.37 ±1.89 / 88.92 ms │     no change │
│ QQuery 96 │        24.76 / 25.05 ±0.19 / 25.31 ms │               24.75 / 24.99 ±0.17 / 25.28 ms │     no change │
│ QQuery 97 │        55.87 / 56.55 ±0.46 / 57.18 ms │               55.92 / 56.49 ±0.36 / 57.07 ms │     no change │
│ QQuery 98 │        42.73 / 43.55 ±0.70 / 44.54 ms │               43.23 / 43.60 ±0.41 / 44.37 ms │     no change │
│ QQuery 99 │        71.02 / 71.17 ±0.11 / 71.34 ms │               72.65 / 75.08 ±4.00 / 83.04 ms │  1.05x slower │
└───────────┴───────────────────────────────────────┴──────────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                           ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                           │ 10212.81ms │
│ Total Time (rich-T-kid_dictionary-groupValuesColumn-impl)   │ 10320.26ms │
│ Average Time (HEAD)                                         │   103.16ms │
│ Average Time (rich-T-kid_dictionary-groupValuesColumn-impl) │   104.25ms │
│ Queries Faster                                              │          1 │
│ Queries Slower                                              │          4 │
│ Queries with No Change                                      │         94 │
│ Queries with Failure                                        │          0 │
└─────────────────────────────────────────────────────────────┴────────────┘

Resource Usage

tpcds — base (merge-base)

Metric Value
Wall time 55.0s
Peak memory 2.1 GiB
Avg memory 1.5 GiB
CPU user 232.4s
CPU sys 5.7s
Peak spill 0 B

tpcds — branch

Metric Value
Wall time 55.0s
Peak memory 2.0 GiB
Avg memory 1.4 GiB
CPU user 234.5s
CPU sys 6.1s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and rich-T-kid_dictionary-groupValuesColumn-impl
--------------------
Benchmark clickbench_partitioned.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                       HEAD ┃ rich-T-kid_dictionary-groupValuesColumn-impl ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 0  │               1.26 / 4.14 ±5.62 / 15.38 ms │                 1.26 / 4.11 ±5.57 / 15.25 ms │     no change │
│ QQuery 1  │             12.80 / 13.24 ±0.25 / 13.48 ms │               13.02 / 13.45 ±0.23 / 13.70 ms │     no change │
│ QQuery 2  │             35.70 / 35.97 ±0.22 / 36.29 ms │               35.71 / 36.10 ±0.22 / 36.35 ms │     no change │
│ QQuery 3  │             30.66 / 31.24 ±0.57 / 32.12 ms │               31.39 / 32.69 ±0.77 / 33.51 ms │     no change │
│ QQuery 4  │      1662.40 / 1738.49 ±46.19 / 1800.88 ms │        1697.23 / 1727.60 ±24.50 / 1760.72 ms │     no change │
│ QQuery 5  │      1647.24 / 1789.02 ±74.92 / 1858.49 ms │        1748.24 / 1832.34 ±57.15 / 1891.17 ms │     no change │
│ QQuery 6  │                1.28 / 1.43 ±0.22 / 1.86 ms │                  1.28 / 1.43 ±0.23 / 1.88 ms │     no change │
│ QQuery 7  │             14.36 / 14.73 ±0.26 / 15.11 ms │              13.99 / 20.53 ±12.01 / 44.55 ms │  1.39x slower │
│ QQuery 8  │      1958.82 / 2080.67 ±81.53 / 2191.35 ms │        2074.19 / 2129.86 ±55.28 / 2235.74 ms │     no change │
│ QQuery 9  │         502.73 / 516.58 ±13.33 / 539.57 ms │           515.62 / 564.49 ±39.50 / 621.11 ms │  1.09x slower │
│ QQuery 10 │           79.57 / 88.93 ±14.01 / 116.79 ms │               75.23 / 79.82 ±5.90 / 91.20 ms │ +1.11x faster │
│ QQuery 11 │            92.98 / 95.68 ±3.88 / 103.33 ms │            89.51 / 102.79 ±22.89 / 148.48 ms │  1.07x slower │
│ QQuery 12 │      1787.65 / 1908.43 ±93.06 / 2035.56 ms │        1690.59 / 1741.34 ±41.41 / 1814.18 ms │ +1.10x faster │
│ QQuery 13 │        448.94 / 647.57 ±221.87 / 941.19 ms │          464.56 / 656.78 ±186.73 / 883.05 ms │     no change │
│ QQuery 14 │         545.72 / 562.16 ±11.27 / 578.99 ms │            559.18 / 568.01 ±6.75 / 579.41 ms │     no change │
│ QQuery 15 │      1883.64 / 1982.67 ±54.23 / 2040.98 ms │        1929.32 / 1990.11 ±55.92 / 2092.16 ms │     no change │
│ QQuery 16 │     4057.50 / 4345.87 ±179.83 / 4616.51 ms │       4027.32 / 4375.88 ±213.32 / 4663.46 ms │     no change │
│ QQuery 17 │     4145.89 / 4348.71 ±147.77 / 4511.44 ms │        4269.75 / 4351.91 ±43.44 / 4388.95 ms │     no change │
│ QQuery 18 │  17930.40 / 18525.55 ±526.98 / 19433.32 ms │    18013.76 / 18636.67 ±735.03 / 20081.40 ms │     no change │
│ QQuery 19 │             28.26 / 28.88 ±0.48 / 29.69 ms │               28.55 / 29.26 ±0.71 / 30.17 ms │     no change │
│ QQuery 20 │          518.19 / 524.99 ±9.35 / 543.20 ms │            521.69 / 525.74 ±4.29 / 533.91 ms │     no change │
│ QQuery 21 │          516.73 / 524.74 ±5.75 / 534.67 ms │            515.13 / 520.41 ±4.05 / 527.09 ms │     no change │
│ QQuery 22 │       993.66 / 1006.43 ±10.81 / 1025.51 ms │           993.41 / 999.17 ±6.20 / 1010.52 ms │     no change │
│ QQuery 23 │      3093.31 / 3149.68 ±36.06 / 3198.87 ms │        3084.80 / 3097.71 ±13.84 / 3123.34 ms │     no change │
│ QQuery 24 │             42.07 / 45.64 ±4.95 / 55.22 ms │               41.73 / 43.97 ±3.32 / 50.50 ms │     no change │
│ QQuery 25 │          112.39 / 114.06 ±1.01 / 115.24 ms │            111.72 / 115.13 ±3.94 / 121.73 ms │     no change │
│ QQuery 26 │             43.06 / 44.70 ±2.35 / 49.31 ms │               41.87 / 45.52 ±3.34 / 50.55 ms │     no change │
│ QQuery 27 │          518.05 / 523.50 ±7.12 / 537.52 ms │            521.72 / 529.37 ±6.27 / 540.50 ms │     no change │
│ QQuery 28 │      3247.79 / 3392.67 ±78.72 / 3485.62 ms │       3478.08 / 3608.05 ±140.82 / 3788.35 ms │  1.06x slower │
│ QQuery 29 │             41.03 / 45.15 ±7.77 / 60.68 ms │               41.17 / 46.55 ±6.62 / 57.75 ms │     no change │
│ QQuery 30 │          581.91 / 588.82 ±6.01 / 598.63 ms │           576.68 / 590.89 ±11.77 / 611.33 ms │     no change │
│ QQuery 31 │         297.20 / 312.47 ±11.26 / 329.95 ms │            294.37 / 305.29 ±7.28 / 314.81 ms │     no change │
│ QQuery 32 │      1041.80 / 1071.32 ±25.07 / 1106.27 ms │          977.14 / 997.97 ±19.69 / 1025.82 ms │ +1.07x faster │
│ QQuery 33 │ 26351.15 / 29175.87 ±1806.10 / 31152.89 ms │   27339.20 / 29403.38 ±2155.57 / 32946.49 ms │     no change │
│ QQuery 34 │ 27439.52 / 30472.00 ±1705.95 / 32103.84 ms │   29052.36 / 31009.65 ±1914.18 / 34091.79 ms │     no change │
│ QQuery 35 │       985.23 / 1103.50 ±69.53 / 1175.49 ms │       1095.15 / 1201.00 ±139.00 / 1471.07 ms │  1.09x slower │
│ QQuery 36 │          165.55 / 175.59 ±7.55 / 184.63 ms │           159.59 / 172.53 ±11.06 / 189.34 ms │     no change │
│ QQuery 37 │           38.13 / 55.50 ±32.48 / 120.41 ms │             38.85 / 55.27 ±23.38 / 101.64 ms │     no change │
│ QQuery 38 │             43.82 / 45.58 ±1.01 / 46.68 ms │               42.03 / 43.92 ±1.33 / 46.19 ms │     no change │
│ QQuery 39 │         175.36 / 201.80 ±24.62 / 247.82 ms │           193.69 / 206.75 ±13.61 / 232.70 ms │     no change │
│ QQuery 40 │             14.87 / 15.46 ±0.69 / 16.75 ms │               14.93 / 16.20 ±1.94 / 20.06 ms │     no change │
│ QQuery 41 │             14.29 / 15.61 ±2.31 / 20.22 ms │               14.51 / 14.77 ±0.18 / 15.05 ms │ +1.06x faster │
│ QQuery 42 │             13.76 / 13.91 ±0.11 / 14.05 ms │               13.68 / 13.90 ±0.19 / 14.24 ms │     no change │
└───────────┴────────────────────────────────────────────┴──────────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
┃ Benchmark Summary                                           ┃             ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
│ Total Time (HEAD)                                           │ 111378.95ms │
│ Total Time (rich-T-kid_dictionary-groupValuesColumn-impl)   │ 112458.32ms │
│ Average Time (HEAD)                                         │   2590.21ms │
│ Average Time (rich-T-kid_dictionary-groupValuesColumn-impl) │   2615.31ms │
│ Queries Faster                                              │           4 │
│ Queries Slower                                              │           5 │
│ Queries with No Change                                      │          34 │
│ Queries with Failure                                        │           0 │
└─────────────────────────────────────────────────────────────┴─────────────┘

Resource Usage

clickbench_partitioned — base (merge-base)

Metric Value
Wall time 560.1s
Peak memory 12.3 GiB
Avg memory 6.5 GiB
CPU user 4931.3s
CPU sys 332.9s
Peak spill 0 B

clickbench_partitioned — branch

Metric Value
Wall time 565.1s
Peak memory 12.0 GiB
Avg memory 6.5 GiB
CPU user 4937.0s
CPU sys 333.2s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@zhuqi-lucas clickbench and tpch benchmarks dont contain dictionary arrays

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

physical-plan Changes to the physical-plan crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants