Skip to content

[opt](build) Take olap_common.h off the dependency base and slim the PCH - #66826

Open
morningman wants to merge 4 commits into
apache:masterfrom
morningman:be-build-opt-2-olap-common
Open

[opt](build) Take olap_common.h off the dependency base and slim the PCH#66826
morningman wants to merge 4 commits into
apache:masterfrom
morningman:be-build-opt-2-olap-common

Conversation

@morningman

Copy link
Copy Markdown
Contributor

Part of the BE cold-build / rebuild-radius reduction series tracked in #66715 (6/6, final PR of the series).

What

Take storage/olap_common.h off the every-TU dependency base: move its three universally-consumed pieces (int128_t/uint128_t typedefs, RowsetId, FieldType) into small dedicated headers, cut four side-door include edges under the column/type base, and drop storage/olap_common.h from pch.h.

The main win is incremental rebuild radius, not cold-build wall clock. Cold build is measured neutral (673.3s vs 674.1s A/B on the PCH removal); what changes is how many TUs recompile when a storage-domain header is touched, and how many preprocessed lines every function/expr TU pays.

Why / mechanism

  • core/types.h -> binary_cast.hpp -> packed_int128.h -> olap_common.h: the deepest base header of the tree carried the whole storage domain because of two int128 typedefs. They move to core/extended_types.h; RowsetId moves to a new storage/rowset_id.h/.cpp (method bodies out-of-line), FieldType to a new storage/field_type.h. olap_common.h re-exports all three, so the 260 direct users see zero API change.
  • exprs/function/function.h included three storage-domain headers (zonemap condition, inverted index iterator, function parser). The three edges are redundantly meshed: cutting any single one is worth almost nothing (-406 / -15,455 / 0 preprocessed lines), cutting the group is -122,885 lines from every function TU.
  • Four side-door edges under the column/type base:
    • core/data_type/primitive_type.h (and formerly core/field.h, see drift note) included util/json/path_in_data.h -> gen_cpp/segment_v2.pb.h (~11.6k lines) for one using VariantMap = std::map<PathInData, FieldWithDataType> alias. A forward declaration suffices.
    • common/logging.h included util/uid_util.h (-> Types_types.h + boost/uuid -> boost/tti) so TaggableLogger::tag could name TUniqueId/PUniqueId in an if constexpr. std::is_same_v works on incomplete types.
    • util/pretty_printer.h included boost/algorithm/string.hpp (~60k lines) for one boost::algorithm::join and two boost::enable_if_c; runtime_profile.h includes pretty_printer.h, so every TU with a profile paid for it. Replaced by direct streaming and std::enable_if_t.
  • pch.h drops storage/olap_common.h (it alone pulled 22 doris headers into the PCH blast line).

Measured effect (mother-branch pairing, clang20 / macOS arm64, ninja -t deps-based radius)

touch this header dependent TUs before after
storage/olap_common.h 318 = every first-party TU (via PCH) + a 219MB PCH rebuild 182
util/uid_util.h 318 = every TU 196
util/json/path_in_data.h 238 172
PCH blast line (doris headers in pch closure) 31 9

multiply.cpp natural closure across the whole series: 432,112 -> 242,764 preprocessed lines (-43.8%); aws/S3 SDK, CLucene and segment_v2.pb.h are gone from function-module closures entirely.

Pre-existing defects fixed on the way

  • exprs/function/function_encryption.cpp: statically out-of-bounds index into bool[4] in the arg_num==4 instantiation (indexed [4]); rewritten as if constexpr dispatch.
  • storage/index/index_file_reader.h: its CLucene warning suppression only worked by include-order luck.
  • storage/segment/condition_cache.h: uses RowsetId but never included a header providing it (leaned on a neighbor's transitive include).

Upstream drift absorbed during rebase

  • [Feature](variant) Add native ColumnVariantV2 execution #65561 (ColumnVariantV2) moved the VariantMap alias plus its util/json/path_in_data.h include from core/field.h into the new core/value/variant/variant_field.h, which field.h now includes — same heavy edge, one hop longer. The cut is applied at the new location: variant_field.h forward-declares PathInData, and the TUs that really instantiate the map (variant_field.cpp, variant_field_test.cpp) include the real header directly. One subtlety: VariantField's class-body = default default constructor was an inline definition, and with the key type forward-declared it would instantiate the VariantMap destructor through the unique_ptr deleter — it moves to the .cpp (declared noexcept, defaulted there); every other special member was already out-of-line. field.h ends up with zero net change. A whole-tree audit of "names PathInData without directly including its header" (8 src + 19 test files) confirmed every one has an independent provider (column_variant.h and the variant reader/writer headers include path_in_data.h themselves); a second sweep for files that spell only VariantMap/legacy_map caught one more — column_variant_v2_test.cpp value-constructs VariantMap {} and now includes the header directly.
  • data_type_array_serde.cpp grew a FieldType:: use upstream ([fix](variant) Forward-port Parquet and external Variant fixes to master #66413 series) after the mother-branch closure sweep, compiling only through the PCH's olap_common.h; with the PCH entry dropped it gets the direct storage/field_type.h include (folded into the pch commit).

Verification

  • Full BE build in this PR's own tree (clang20 / macOS arm64, unity=ON, PCH=ON, -j14): 7446/7446 targets, zero failures, doris_be links (319MiB).
  • BE UT build + link (BUILD_TYPE_UT=Debug): 8503 targets green, doris_be_test links (306MiB), zero duplicate/undefined symbols. The variant suites touched by the drift absorption ran green: VariantFieldTest.* + ColumnVariantV2* = 61/61 passed.
  • Mother-branch verification of the same changes: closure-sweep 300/300 TUs clean (each TU -fsyntax-only against its real include closure, no PCH symbol leakage — tooling from [opt](build) Add build-timing and header-closure sweep tooling #66616); 4 rounds of incremental rebuild; 3 rounds of BE UT.
  • The SKIP_PRECOMPILE_HEADERS / PCH interaction has a dedicated A/B: PCH-drop is wall-clock neutral (673.3s vs 674.1s), so the radius win is free.

Deliberately disclosed

  • This PR's benefit shows up when editing storage headers and in per-TU preprocessed size, not in cold-build totals — do not evaluate it by cold-build wall clock.
  • olap_common.h still re-exports the three moved headers; nothing was migrated call-site-by-call-site. Peeling direct users off the re-export is possible follow-up, not needed for the win.
  • All measurements are clang20/macOS; Linux gcc/clang lines are covered by this PR's CI. The three include cuts are pure edge removals verified by closure-sweep, so platform risk concentrates in the two new headers (rowset_id.h, field_type.h), which are plain moves.

morningman and others added 4 commits August 17, 2026 11:13
… olap_common.h

Three foundational entities lived in storage/olap_common.h, which drags
gen_cpp/Types_types.h, io_common, uid_util (boost/uuid) and friends into
every closure that needs any of them:

- int128_t/uint128_t -> core/extended_types.h. core/types.h reaches
  olap_common through binary_cast.hpp -> packed_int128.h purely for these
  two aliases, which put the storage layer underneath every TU in the
  codebase; util/coding.h had the same dependency for uint128_t.
- RowsetId -> storage/rowset_id.h (new), a dependency-free header
  (cstdint/functional/iosfwd/string) safe for core/column/column.h.
  Method bodies, the hex helpers dependency and MAX_ROWSET_ID/LOW_56_BITS
  move to storage/rowset_id.cpp; std::hash<RowsetId>::operator() is
  defined out of line so the header does not need hash_util.hpp.
- enum FieldType (+ the three field_is_*_type helpers) ->
  storage/field_type.h (new), so data-type headers can name storage cell
  types without the rest of olap_common.h.

olap_common.h includes the three light headers, so its own users are
unaffected. Includer fixes: packed_int128.h / util/coding.h /
data_type_number_serde.h now use extended_types.h; column.h /
column_nullable.h use rowset_id.h; data_type_decimal.h uses field_type.h;
data_type_ipv4.h and ipv4/ipv6 serde headers dropped a dead olap_common
include; decimal12.h carries its own power table instead of pulling
storage/utils.h.

The closure-sweep natural-closure gate (300 first-party TUs, PCH
stripped) surfaced every TU that only compiled through the now-cut
transitive paths; fixed at the owning header: metadata_adder.h
(rowset_fwd), runtime_profile.h (cast_set), column_reader_cache.h
(io_common + olap_common), condition_cache.h (rowset_id),
python_client.h (olap_define for DISALLOW_COPY_AND_ASSIGN),
format_v2/file_reader.h and tracing_file_reader.h (io_common), four
data-type headers (field_type). function_encryption.cpp: the const-args
dispatch is now `if constexpr` so the arg_num==4 instantiation no longer
indexes col_const[4]/argument_columns[4] out of bounds (-Warray-bounds
fired once the include graph changed).

Verification: closure-sweep 300/300 clean vs p3-pre baseline;
compile_bench full rebuild + doris_be link green at -j6; BE UT Debug
build green, 31 tests / 6 suites passed (RowsetId behavior:
IdManagerTest, IdFileMapTest, StorageResourceTest, TestRowIdConversion,
TxnManagerTest; registration contract: BinaryArithmeticRegistrationTest).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
exprs/function/function.h is included by every scalar-function TU, and
three of its includes pulled the storage/index domain (zone-map ->
thrift + S3 SDK; inverted iterator -> reader -> tablet_schema + CLucene;
inverted parser) into all of them. All heavy types appear only as
pointers/references in the interface, so forward declarations suffice:
DictionaryEvalContext/BloomFilterEvalContext are declared with their real
doris::expr_zonemap:: home plus the same doris-level aliases
expr_zonemap_filter.h defines; segment_v2::IndexIterator and
InvertedIndexResultBitmap as classes. zonemap_filter_result.h (456
preprocessed lines) stays: ZoneMapFilterResult is returned by value.

multiply.cpp natural closure: 432,112 -> 308,140 lines (-28.7%) together
with the previous commit; the three edges are redundant with each other,
so cutting them individually moves almost nothing -- they only pay off
as a set. doris_be also shrinks 328KB from fewer transitively visible
inline weak symbols in function TUs.

Dependents that really use the cut headers now include them directly
(closure-sweep verified, 300/300 clean): functions_comparison.h and
function_ip.h materialize InvertedIndexParam (inverted_index_iterator.h);
is_null.h/is_not_null.h call IndexIterator methods (index_iterator.h);
cast_to_string.h/cast_to_timestamptz.h dereference RuntimeState
(runtime/runtime_state.h). index_file_reader.h wraps its CLucene includes
in the codebase's established -Wconversion suppression: whether CLucene's
first expansion lands inside someone's suppressed region depends on
include order, and this TU became the first expansion point once the
function.h edge disappeared.

Verification: closure-sweep 300/300 clean vs p3-pre; compile_bench
rebuild (200 targets) + doris_be link green at -j6; BE UT green -- 44
tests passed (ExprZonemapFilterTest, SegmentIteratorExprZonemapTest,
SegmentIteratorApplyIndexExprTest, BinaryArithmeticRegistrationTest).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
…ype base

Four small usages were each dragging a heavy header into the closure of
nearly every TU:

- core/data_type/primitive_type.h included util/json/path_in_data.h
  (-> gen_cpp/segment_v2.pb.h, ~11.6k preprocessed lines) for one
  `using VariantMap = std::map<PathInData, FieldWithDataType>` alias.
  core/field.h used to carry the same alias and include until apache#65561
  moved both into core/value/variant/variant_field.h, which field.h now
  includes -- the same edge, one hop longer. A forward declaration is
  enough for the alias in both headers. VariantField's
  std::unique_ptr<VariantMap> member needs every special member
  out-of-line for that; the only inline one, the class-body defaulted
  default constructor, would instantiate the VariantMap destructor
  through the _legacy deleter, so it moves to the .cpp (declared
  noexcept, defaulted there). TUs that instantiate the map include the
  real header.
- common/logging.h included util/uid_util.h (-> Types_types.h +
  boost/uuid -> boost/tti -> boost/function_types) so that
  TaggableLogger::tag could name TUniqueId/PUniqueId in an `if constexpr`
  and call print_id. std::is_same_v works on incomplete types, so
  declaring the two classes plus the two print_id overloads suffices;
  callers that actually log an id already have the definitions.
- util/pretty_printer.h included boost/algorithm/string.hpp (~60k lines
  through boost/function) for one boost::algorithm::join and two
  boost::enable_if_c. Replaced by direct streaming (which also drops the
  intermediate vector<string> materialization) and std::enable_if_t.
  runtime_profile.h includes pretty_printer.h, so every TU with a
  profile was paying for it.

Dependents that really use the cut headers now include them directly
(closure-sweep verified, 300/300 clean): segment_iterator.h, field.cpp,
variant_field.cpp, variant_field_test.cpp and column_variant_v2_test.cpp
(path_in_data.h),
vmatch_predicate.cpp and schema_scan_operator.cpp
(boost/algorithm/string.hpp for split/iequals).
ColumnPredicateInfo::debug_string also used boost::join and now streams
its std::set directly.

multiply.cpp natural closure with the whole Phase 3 series so far:
432,112 -> 242,764 lines (-43.8%); aws, CLucene and segment_v2.pb.h are
gone from it entirely.

Verification: closure-sweep 300/300 clean vs p3-pre; compile_bench
rebuild (318 targets, PCH-wide) + doris_be link green at -j6; BE UT
build green, 43 tests passed across the affected suites plus 462 in the
variant/profile sweep. The two SegmentFlusherFormatTest
"...KeepTheirSegmentBytes" cases fail both with and without this change
(verified by rebuilding the UT binary at the parent commit), so they are
pre-existing and unrelated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
pch.h is a dependency of every first-party object, so each doris header
it pulls in becomes a tripwire: touching that header invalidates the PCH
and rebuilds the whole BE, however few TUs actually name a symbol from
it. storage/olap_common.h dragged in 22 more doris headers this way
(io_common, uid_util, hash_util, time, olap_define, rowset_fwd,
inverted_index_stats, ...).

With the preceding commits every TU compiles against its natural include
closure (closure-sweep --no-pch is clean for all 300 first-party TUs),
so the entry can go. Third-party headers stay: absorbing those is what a
PCH is for. One TU grew a bare dependency upstream since that sweep:
data_type_array_serde.cpp now names FieldType (apache#66413 series) and only
compiled through the PCH's olap_common.h; it gets the direct
storage/field_type.h include.

Effect on the incremental rebuild radius (ninja -t deps, first-party
objects):

  storage/olap_common.h   318 (all, via PCH) -> 182 real dependents
  util/uid_util.h         318 (all, via PCH) -> 196 real dependents

and the world-rebuild tripwire set shrinks from 31 doris headers to 9
(config/status/check/compiler_util/expected/version_internal/stack_util
and pch.h itself).

multiply.cpp preprocessed size, PCH-inclusive (the size the front end
actually sees in a real build): 806k -> 717,285 lines.

Verification: compile_bench full rebuild (318 targets) + doris_be link
green at -j6.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

morningman added a commit that referenced this pull request Aug 17, 2026
…count probe (FE) (#66831)

### What

Two independent breakages that each make **current master fail to
build** — one in BE configure, one in FE compile.

They share a shape: a pair of PRs that never conflict textually, merge
cleanly, and only break once combined, so each PR's own pipeline was
green.

| | Breakage | Colliding PRs |
|---|---|---|
| BE | `cmake` configure aborts | #66052 moved a file, #66789 made a
dangling unity-skip entry fail loud |
| FE | `fe-connector-iceberg` does not compile | #66778 deleted
`getCountFromSnapshot()`, #66413 added a caller for it |

CI merges each PR into the latest master before building, so **every PR
pipeline that picks up current master is red** on one or both.

---

## 1. BE — stale `STORAGE_UNITY_SKIP` entry for a moved file

Remove the stale `STORAGE_UNITY_SKIP` entry (and its comment block) for
`compaction/collection_statistics.cpp`, which no longer exists.

### Why — master configure is currently broken

#66052 moved `storage/compaction/collection_statistics.{cpp,h}` to
`storage/index/inverted/similarity/` (rewritten), but left behind the
unity-skip entry that #66789 had added for the old path. The fail-loud
validation introduced by #66789 turns a dangling skip entry into a
configure-time error — which is exactly what it is designed to catch (a
skip list rotting after a file move), so BE configure on current master
fails immediately:

```
CMake Error at CMakeLists.txt:1002 (message):
  unity skip entry does not exist (renamed or moved?):
  .../be/src/storage/compaction/collection_statistics.cpp
```

#66826, #66824, #66819, #66820 were the first hits — same error on
multiple independent agents.

### Why deletion (not a path update) is correct

The old entry existed because the old `collection_statistics_test`
`#include`d the `.cpp` into a second TU (unity batching would then
produce a duplicate definition at link time). The rewritten file at the
new location is not `#include`d by any test (`grep -rn
'collection_statistics.cpp' be/test/` is empty on master), so the new
path needs no skip entry.

### Verification

- Full BE build from a clean tree at master + this change (clang20 /
macOS arm64, unity=ON, PCH=ON): configure passes the skip-list
validation and the build compiles. (The same tree without this change
fails configure with the error above.)
- Timeline note: #66052's last green CI round presumably predates
#66789's validation landing (2026-08-16), which is how the dangling
entry slipped through.

---

## 2. FE — the metadata-only COUNT(\*) probe calls a deleted method

#66778 replaced the snapshot-summary COUNT(\*) pushdown with a
manifest-derived count and deleted `getCountFromSnapshot()`.
`canServeMetadataOnlyCount()`, added by #66413, still calls it, so FE
compilation fails:

```
[ERROR] .../connector/iceberg/IcebergScanPlanProvider.java:[505,16] cannot find symbol
[ERROR]   symbol:   method getCountFromSnapshot(org.apache.iceberg.TableScan,org.apache.doris.connector.spi.ConnectorSession)
[ERROR]   location: class org.apache.doris.connector.iceberg.IcebergScanPlanProvider
```

### Why re-express the probe instead of restoring the method

Bringing `getCountFromSnapshot()` back would reintroduce precisely what
#66778 removed: a query result derived from optional, writer-provided
snapshot summary fields.

The probe is rebuilt in #66778's own terms instead. It reuses that PR's
delete gate and additionally requires the data manifests to carry
aggregate row counters, so the answer is proved from the manifest list
alone — `O(manifests)`, no data-file enumeration, which is what a probe
running before planning can afford.

Manifest lists that omit those aggregates now answer `false`, where
count planning still serves them through its bounded per-file fallback.
A capability probe should under-promise rather than over-promise; the
planner itself is untouched.

### Verification

- `mvn package` over the full FE reactor (74 modules): all green. This
also confirms no second semantic break is hiding behind the first — CI's
maven stops at `fe-connector-iceberg` and never reaches the rest.
- `IcebergScanPlanProviderTest`: 153 tests, 0 failures, including a new
case pinning that the probe follows the same delete gate as count
planning.
- FE checkstyle: 0 violations.

### Release note

None (both fixes only restore a buildable master; no user-visible
behavior change).

### Check List (For Author)

- Test
- [x] Regression test — not applicable: neither change alters query
behavior
  - [x] Unit test: `IcebergScanPlanProviderTest` (153 tests, 0 failures)
  - [x] Manual test: full BE configure/build and full FE reactor build
- Behavior changed: No
- Does this need documentation: No

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 17367 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 601620bd306dfe010a4e2f2deea0b0c09a181dff, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17571	3141	3136	3136
q2	1882	237	165	165
q3	10462	854	501	501
q4	4671	242	201	201
q5	7685	573	389	389
q6	139	116	100	100
q7	518	504	392	392
q8	9266	930	973	930
q9	3467	2383	2382	2382
q10	6526	851	707	707
q11	453	258	237	237
q12	696	412	318	318
q13	17856	1521	1152	1152
q14	160	148	137	137
q15	q16	440	399	367	367
q17	831	820	796	796
q18	3123	2251	2229	2229
q19	1145	892	737	737
q20	623	547	477	477
q21	5342	1777	1941	1777
q22	324	271	237	237
Total cold run time: 93180 ms
Total hot run time: 17367 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	3532	3454	3468	3454
q2	211	216	157	157
q3	2201	2381	2154	2154
q4	1192	1171	904	904
q5	2173	2096	2116	2096
q6	169	126	91	91
q7	1059	902	876	876
q8	1625	1458	1423	1423
q9	3141	3150	3123	3123
q10	1855	1812	1631	1631
q11	361	275	252	252
q12	458	435	342	342
q13	1510	1523	1187	1187
q14	168	175	166	166
q15	q16	408	406	353	353
q17	1062	1042	1040	1040
q18	4921	4390	4763	4390
q19	851	826	851	826
q20	978	927	801	801
q21	3738	3107	3226	3107
q22	392	347	334	334
Total cold run time: 32005 ms
Total hot run time: 28707 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 83753 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 601620bd306dfe010a4e2f2deea0b0c09a181dff, data reload: false

query5	4263	421	347	347
query6	404	174	166	166
query7	4844	462	266	266
query8	291	133	118	118
query9	8679	2931	2923	2923
query10	425	258	223	223
query11	5361	1038	912	912
query12	115	72	70	70
query13	1193	442	330	330
query14	6190	2220	2106	2106
query14_1	1996	2002	2008	2002
query15	169	122	125	122
query16	919	375	396	375
query17	769	449	377	377
query18	2320	331	230	230
query19	167	134	112	112
query20	70	68	68	68
query21	211	114	100	100
query22	5332	5330	5244	5244
query23	6721	6303	5994	5994
query23_1	6240	5927	6056	5927
query24	7261	1095	758	758
query24_1	749	768	771	768
query25	412	283	237	237
query26	1257	263	162	162
query27	2725	443	288	288
query28	4630	1529	1559	1529
query29	943	454	361	361
query30	277	181	154	154
query31	844	431	365	365
query32	101	50	51	50
query33	480	232	190	190
query34	1002	829	489	489
query35	400	401	345	345
query36	569	551	524	524
query37	121	82	73	73
query38	1012	843	826	826
query39	514	509	469	469
query39_1	501	466	470	466
query40	217	125	110	110
query41	58	56	55	55
query42	84	83	77	77
query43	248	247	218	218
query44	1031	588	558	558
query45	118	106	105	105
query46	814	839	521	521
query47	774	749	717	717
query48	315	326	257	257
query49	564	248	212	212
query50	814	338	263	263
query51	8259	8164	8256	8164
query52	72	75	66	66
query53	214	229	216	216
query54	244	193	180	180
query55	76	65	60	60
query56	233	243	276	243
query57	703	674	663	663
query58	216	192	195	192
query59	1232	1242	1108	1108
query60	292	205	201	201
query61	120	114	118	114
query62	380	207	184	184
query63	189	159	157	157
query64	2717	660	701	660
query65	1720	1595	1660	1595
query66	1959	328	247	247
query67	10115	9561	9689	9561
query68	2743	1259	799	799
query69	328	224	205	205
query70	670	631	615	615
query71	293	285	238	238
query72	2305	1720	1630	1630
query73	628	577	349	349
query74	1560	1228	1151	1151
query75	1206	1162	1011	1011
query76	2306	741	541	541
query77	252	269	217	217
query78	3915	3628	3183	3183
query79	2831	836	581	581
query80	1543	398	347	347
query81	504	197	180	180
query82	612	136	103	103
query83	316	258	235	235
query84	302	123	106	106
query85	867	445	396	396
query86	454	176	173	173
query87	1004	966	897	897
query88	3037	2123	2149	2123
query89	301	225	202	202
query90	2035	147	148	147
query91	153	150	121	121
query92	57	49	46	46
query93	2044	1198	751	751
query94	657	261	232	232
query95	625	426	337	337
query96	809	595	294	294
query97	1035	1050	1006	1006
query98	185	138	127	127
query99	428	343	309	309
Total cold run time: 179626 ms
Total hot run time: 83753 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 14.77 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 601620bd306dfe010a4e2f2deea0b0c09a181dff, data reload: false

query1	0.00	0.01	0.00
query2	0.07	0.04	0.03
query3	0.25	0.11	0.11
query4	1.60	0.10	0.09
query5	0.18	0.16	0.17
query6	1.25	0.68	0.69
query7	0.03	0.01	0.01
query8	0.05	0.03	0.03
query9	0.28	0.20	0.21
query10	0.34	0.35	0.35
query11	0.16	0.11	0.11
query12	0.14	0.12	0.12
query13	0.31	0.30	0.30
query14	0.45	0.44	0.46
query15	0.38	0.35	0.34
query16	0.22	0.23	0.21
query17	0.69	0.66	0.66
query18	0.19	0.17	0.17
query19	1.18	1.19	1.20
query20	0.01	0.01	0.01
query21	15.43	0.15	0.12
query22	5.08	0.05	0.04
query23	16.14	0.25	0.10
query24	3.05	0.34	0.25
query25	0.11	0.04	0.03
query26	0.75	0.16	0.13
query27	0.03	0.03	0.03
query28	3.63	0.60	0.28
query29	12.44	3.15	2.55
query30	0.25	0.11	0.12
query31	2.76	0.37	0.18
query32	3.52	0.31	0.23
query33	1.35	1.53	1.55
query34	15.34	2.21	1.76
query35	1.74	1.75	1.70
query36	0.45	0.29	0.28
query37	0.06	0.04	0.04
query38	0.04	0.04	0.03
query39	0.02	0.02	0.03
query40	0.11	0.08	0.09
query41	0.07	0.02	0.02
query42	0.02	0.02	0.02
query43	0.03	0.03	0.03
Total cold run time: 90.2 s
Total hot run time: 14.77 s

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants