StarRocks / starrocks

StarRocks, a Linux Foundation project, is a next-generation sub-second MPP OLAP database for full analytics scenarios, including multi-dimensional analytics, real-time analytics, and ad-hoc queries.
https://starrocks.io
Apache License 2.0
8.26k stars 1.67k forks source link

[Enhancement] optimize lookup for dictionary (backport #47050) #47615

Closed mergify[bot] closed 3 days ago

mergify[bot] commented 3 days ago

[Enhancement] optimize lookup for dictionary

This pr introduce some optimization for looking up dictionary:

  1. reserve the memory for the dest column which using for saving the result to avoid the memory reallocation.
  2. Using _append_value instead of creating Datum for appending.
  3. If the value type is Slice, save the slice first and append when to loop is finished. Avoid polluting the cpu cache for the prefetched content.

In our test case, for 1BE(16cpu, 128GB) + 1FE, here is the expression computation time: key: int -> value: (int) : 572ms(before optimization) vs. 268ms(after optimization) key: int -> value: (int, int) : 732ms(before optimization) vs. 395ms(after optimization) key: int -> value: (int, int, varchar(length 128)) : 1s211ms(before optimization) vs. 744ms(after optimization)

Fixes #issue

What type of PR is this:

Does this PR entail a change in behavior?

If yes, please specify the type of change:

Checklist:

Bugfix cherry-pick branch check:

This pr introduce some optimization for looking up dictionary:

  1. reserve the memory for the dest column which using for saving the result to avoid the memory reallocation.
  2. Using _append_value instead of creating Datum for appending.
  3. If the value type is Slice, save the slice first and append when to loop is finished. Avoid polluting the cpu cache for the prefetched content.

In our test case, for 1BE(16cpu, 128GB) + 1FE, here is the expression computation time: key: int -> value: (int) : 572ms(before optimization) vs. 268ms(after optimization) key: int -> value: (int, int) : 732ms(before optimization) vs. 395ms(after optimization) key: int -> value: (int, int, varchar(length 128)) : 1s211ms(before optimization) vs. 744ms(after optimization)

Fixes #issue

What type of PR is this:

Does this PR entail a change in behavior?

If yes, please specify the type of change:

Checklist: