Skip to content

[opt](local shuffle) support bucket shuffle for set operation#65129

Open
924060929 wants to merge 1 commit into
masterfrom
fe_local_shuffle
Open

[opt](local shuffle) support bucket shuffle for set operation#65129
924060929 wants to merge 1 commit into
masterfrom
fe_local_shuffle

Conversation

@924060929

@924060929 924060929 commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Related PR: #59006, #60823

Problem Summary:

Re-enable bucket shuffle for set operation (union / intersect / except).

This optimization was introduced by #59006 and later disabled by #60823, because at that time the backend could not plan the correct local shuffle type for set operation, which produced wrong results. Now that planning local shuffle in the frontend is supported, the frontend plans the correct local shuffle type, so it is safe to re-enable this feature.

When enable_local_shuffle_planner is enabled (the default), the optimizer keeps the distribution of the largest natural / storage-bucketed child of a set operation and bucket-shuffles the other children onto it (the same idea as bucket shuffle join), which avoids a full reshuffle of the largest side. When it is disabled, the previous full-shuffle behavior is kept, so this change is gated and only takes effect with the frontend local shuffle planner.

Besides re-enabling the planning, two local-exchange alignment problems that the re-enabled shapes expose are fixed (both verified on a 4-BE cluster with a stable wrong-result reproduction before the fix and correct results after):

  1. SetOperationNode.enforceAndDeriveLocalExchange only handled the colocate mode. A bucket-shuffle intersect / except whose basic child is a join output (instead of a direct scan) fell into the partitioned branch, so the basic side was locally re-partitioned by execution hash while the other side stayed bucket-distributed, and the set operation lost rows. Now the bucket-shuffle mode takes the same requireBucketHash path as colocate, mirroring HashJoinNode.

  2. RequireSpecific.autoRequireHash() degraded LOCAL_EXECUTION_HASH_SHUFFLE to the generic hash requirement. Pass-through operators (union / streaming agg / sort) forward this requirement to children while claiming the specific type to their parent, so under a bucket join upgraded to local hash, a bucket-distributed child could satisfy the generic requirement and keep its bucket placement while the parent skipped its re-align local exchange, and the mixed placements computed wrong results. A specific hash requirement is now forwarded as-is.

The regression suite disables the bucket shuffle downgrade so the chosen shapes do not depend on the backend count / parallelism of the environment, and adds a case where the basic child of a bucket-shuffle intersect is a join output.

Release note

None

Check List (For Author)

  • Test

    • Regression test
    • Unit Test
    • Manual test (add detailed scripts or steps below)
      • Verified on a 4-BE cluster: intersect / except / union results are identical with enable_local_shuffle_planner on and off, including the shapes above with a stable wrong-result reproduction before the fixes.
    • No need to test or manual test. Explain why:
      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change.
      • No code files have been changed.
      • Other reason
  • Behavior changed:

    • No.
    • Yes.
  • Does this need documentation?

    • No.
    • Yes.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@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?

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17725	4083	4060	4060
q2	2088	324	210	210
q3	10236	1432	839	839
q4	4688	471	347	347
q5	7525	884	564	564
q6	183	169	137	137
q7	781	855	628	628
q8	9343	1538	1646	1538
q9	5772	4441	4471	4441
q10	6815	1811	1544	1544
q11	518	348	333	333
q12	700	580	431	431
q13	18124	3471	2753	2753
q14	279	269	247	247
q15	q16	792	788	707	707
q17	1040	1049	1004	1004
q18	7082	5733	5681	5681
q19	1311	1256	1132	1132
q20	776	700	568	568
q21	6065	2763	2490	2490
q22	452	365	305	305
Total cold run time: 102295 ms
Total hot run time: 29959 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4387	4280	4293	4280
q2	302	318	210	210
q3	4561	4941	4405	4405
q4	2090	2195	1389	1389
q5	4431	4332	4314	4314
q6	234	180	129	129
q7	2065	2036	1652	1652
q8	2495	2222	2172	2172
q9	8330	7783	7844	7783
q10	4719	4765	4269	4269
q11	559	422	373	373
q12	801	758	557	557
q13	3287	3560	2860	2860
q14	303	297	280	280
q15	q16	699	751	661	661
q17	1346	1318	1438	1318
q18	7787	7347	7128	7128
q19	1186	1128	1140	1128
q20	2225	2184	1946	1946
q21	5270	4587	4437	4437
q22	530	469	403	403
Total cold run time: 57607 ms
Total hot run time: 51694 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 174275 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 935959445b656b169b10c6b565bfcf1b377c9f36, data reload: false

query5	4316	655	519	519
query6	479	241	219	219
query7	4962	626	342	342
query8	340	211	172	172
query9	8798	4028	4075	4028
query10	482	342	311	311
query11	5974	2377	2143	2143
query12	166	107	102	102
query13	1275	625	435	435
query14	6230	5321	4991	4991
query14_1	4290	4296	4353	4296
query15	221	200	178	178
query16	1016	484	467	467
query17	951	724	616	616
query18	2423	468	339	339
query19	200	187	147	147
query20	110	106	107	106
query21	226	151	143	143
query22	13577	13608	13347	13347
query23	17264	16532	16077	16077
query23_1	16246	16368	16128	16128
query24	7497	1789	1306	1306
query24_1	1331	1324	1305	1305
query25	532	453	379	379
query26	1327	375	213	213
query27	2593	623	383	383
query28	4485	2021	2040	2021
query29	1084	631	479	479
query30	351	265	222	222
query31	1108	1096	974	974
query32	110	67	76	67
query33	519	322	244	244
query34	1205	1139	662	662
query35	770	775	678	678
query36	1399	1397	1221	1221
query37	154	109	91	91
query38	1892	1667	1674	1667
query39	951	929	896	896
query39_1	875	889	891	889
query40	247	168	142	142
query41	85	79	83	79
query42	101	99	94	94
query43	329	325	285	285
query44	1420	796	772	772
query45	223	199	186	186
query46	1082	1285	777	777
query47	2424	2367	2237	2237
query48	417	436	321	321
query49	613	438	331	331
query50	1121	453	346	346
query51	4502	4490	4392	4392
query52	90	91	79	79
query53	265	295	212	212
query54	303	247	241	241
query55	80	74	71	71
query56	324	318	297	297
query57	1439	1437	1345	1345
query58	309	280	281	280
query59	1607	1674	1457	1457
query60	327	302	274	274
query61	184	175	175	175
query62	703	660	594	594
query63	253	219	218	218
query64	2604	833	680	680
query65	4915	4835	4800	4800
query66	1863	547	414	414
query67	29768	29689	29527	29527
query68	3166	1537	984	984
query69	439	310	273	273
query70	1091	969	975	969
query71	380	324	323	323
query72	2892	2672	2311	2311
query73	898	887	470	470
query74	5099	5057	4798	4798
query75	2626	2602	2256	2256
query76	2332	1226	790	790
query77	360	388	303	303
query78	12576	12511	11751	11751
query79	1440	1141	752	752
query80	1288	549	466	466
query81	544	341	287	287
query82	593	157	121	121
query83	368	319	295	295
query84	341	170	135	135
query85	997	626	521	521
query86	429	293	281	281
query87	1832	1817	1762	1762
query88	3764	2840	2785	2785
query89	456	427	355	355
query90	1934	205	189	189
query91	207	187	163	163
query92	65	62	54	54
query93	1627	1476	990	990
query94	734	352	303	303
query95	797	501	565	501
query96	1080	770	361	361
query97	2702	2676	2541	2541
query98	223	208	200	200
query99	1189	1153	1031	1031
Total cold run time: 260268 ms
Total hot run time: 174275 ms

@hello-stephen

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

query1	0.00	0.00	0.01
query2	0.10	0.04	0.05
query3	0.26	0.14	0.14
query4	1.60	0.14	0.14
query5	0.24	0.22	0.22
query6	1.22	1.08	1.06
query7	0.04	0.01	0.00
query8	0.06	0.04	0.04
query9	0.37	0.33	0.32
query10	0.55	0.58	0.55
query11	0.20	0.15	0.15
query12	0.19	0.15	0.15
query13	0.47	0.48	0.48
query14	1.02	1.02	1.00
query15	0.62	0.59	0.61
query16	0.31	0.32	0.33
query17	1.06	1.14	1.08
query18	0.22	0.21	0.21
query19	2.04	1.89	1.95
query20	0.02	0.01	0.01
query21	15.43	0.20	0.13
query22	4.90	0.05	0.05
query23	16.14	0.30	0.12
query24	2.91	0.42	0.33
query25	0.12	0.06	0.06
query26	0.74	0.20	0.15
query27	0.04	0.04	0.04
query28	3.52	0.98	0.55
query29	12.55	4.43	3.47
query30	0.27	0.17	0.16
query31	2.77	0.63	0.32
query32	3.25	0.61	0.50
query33	3.32	3.26	3.20
query34	15.70	4.22	3.67
query35	3.49	3.55	3.55
query36	0.57	0.45	0.43
query37	0.10	0.06	0.06
query38	0.05	0.04	0.04
query39	0.04	0.03	0.03
query40	0.19	0.16	0.14
query41	0.09	0.04	0.03
query42	0.04	0.03	0.03
query43	0.04	0.04	0.03
Total cold run time: 96.86 s
Total hot run time: 25.48 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 83.15% (74/89) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 47.13% (74/157) 🎉
Increment coverage report
Complete coverage report

@morrySnow morrySnow left a 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.

Code Review Summary

This PR re-enables bucket shuffle for set operations (UNION/INTERSECT/EXCEPT) by uncommenting previously-disabled planner logic, gated on enableLocalShufflePlanner. The approach is sound — when the FE local shuffle planner is active, the largest storage-bucketed child keeps its distribution while other children are bucket-shuffled onto it. Below are the findings, ranked by severity.

All findings verified against the PR branch (fe_local_shuffle) and master.

for (Plan child : setOperation.children()) {
PhysicalPlan childPhysicalPlan = (PhysicalPlan) child;
if (JoinUtils.isStorageBucketed(childPhysicalPlan.getPhysicalProperties())) {
setOperationNode.setDistributionMode(DistributionMode.BUCKET_SHUFFLE);

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.

Colocate and BUCKET_SHUFFLE can both be set on the same SetOperationNode.

The existing setColocate(true) at line 2496 and the new setDistributionMode(BUCKET_SHUFFLE) here can both fire on the same node. The basic bucket-shuffle child's OlapScan may be directly visible (no exchange wrapper), so findOlapScanNodesByPassExchangeNode finds it and sets colocate=true. Then this new check also finds storage-bucketed children and sets BUCKET_SHUFFLE.

For hash joins, colocate and BUCKET_SHUFFLE are mutually exclusive via an explicit if-else chain (lines 1718 vs 1728). For set operations, no such exclusivity exists. The interaction between colocate scheduling (hasColocatePlanNode) and bucket shuffle scheduling (isBucketShuffle()) on the same set operation node is unclear and untested.

Suggestion: Follow the hash join pattern — make colocate and BUCKET_SHUFFLE mutually exclusive for set operations too, or document the expected interaction.

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.

For a set operation the two flags are complementary rather than alternative execution modes, unlike hash join: isColocate describes the bucket-aligned scheduling of the fragment (the basic bucket-shuffle child scans buckets directly, so the pre-existing direct-scan rule fires — and it must fire, the fragment needs colocate scheduling for the bucket alignment to hold), while BUCKET_SHUFFLE describes how the other children arrive (bucket-shuffle exchanges). Both routes converge to the same bucket-hash local exchange requirement in SetOperationNode.enforceAndDeriveLocalExchange (isColocated(this) || isBucketShuffle()), so their coexistence is intended. Documented this at the site. Also verified on a 4-BE cluster that this combination produces correct results, including the shape where the basic child is a join output (covered by the new regression case bucket_shuffle_join_as_basic_child).

// bucket instead of execution-bucketed hash.
for (Plan child : setOperation.children()) {
PhysicalPlan childPhysicalPlan = (PhysicalPlan) child;
if (JoinUtils.isStorageBucketed(childPhysicalPlan.getPhysicalProperties())) {

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.

Missing enableLocalShufflePlanner gate.

The translator unconditionally sets BUCKET_SHUFFLE when storage-bucketed children are detected. ChildrenPropertiesRegulator (line 664) and RequestPropertyDeriver (line 348) both explicitly gate their new behavior on enableLocalShufflePlanner, but the translator does not.

While the invariant holds today — storage-bucketed children only appear when the planner gate is active — the dependency is implicit. A defensive guard (or at minimum a comment) would make this explicit and prevent silent breakage if a future planner change produces STORAGE_BUCKETED children without the gate.

// Suggestion: add guard
if (enableLocalShufflePlanner) {
    for (Plan child : setOperation.children()) { ... }
}

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.

Added the isEnableLocalShufflePlanner() guard here, so the three sites (RequestPropertyDeriver / ChildrenPropertiesRegulator / translator) are explicitly consistent now.

if (childDistribution instanceof DistributionSpecHash
&& supportBucketShuffleTypes.contains(
((DistributionSpecHash) childDistribution).getShuffleType())
&& !(isBucketShuffleDownGrade(setOperation.child(i)))) {

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.

isEnableBucketShuffleJoin controls set operation bucket shuffle.

The isBucketShuffleDownGrade method (line 294) checks ConnectContext.get().getSessionVariable().isEnableBucketShuffleJoin(), a join-specific session variable. A user who disables bucket shuffle for joins (enable_bucket_shuffle_join=false) also silently loses the set operation bucket shuffle optimization, with no independent control.

This coupling existed in the original commented-out PR #59006 code and is now activated. Consider whether set operations warrant a separate session variable, or at minimum document this coupling in the session variable description.

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.

This coupling is intentional: bucket shuffle for set operation belongs to the same optimization family as bucket shuffle join (same downgrade trade-off: bucket count vs instance parallelism), so the join switch and bucket_shuffle_downgrade_ratio govern both instead of introducing one more session variable. Documented the coupling at the call site. If you prefer an independent switch I can split it out in a follow-up.

// shuffle: with the BE-side local-shuffle planner the backend cannot infer the
// correct local shuffle type for the set sink/probe and computes wrong results, so
// fall back to EXECUTION_BUCKETED there.
ConnectContext setOperationContext = ConnectContext.get();

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.

Redundant ConnectContext.get() — use this.connectContext instead.

The class already holds a private final ConnectContext connectContext field (line 102), set in both constructors (lines 107, 112) and used throughout the class (lines 150, 160, 171, 182). The new code calls ConnectContext.get() (thread-local lookup) unnecessarily. Using the existing field would be both simpler and consistent with the rest of the class.

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.

Good catch, changed to use the existing connectContext field.

@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

1 similar comment
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

Re-enable bucket shuffle for set operation / union: the largest natural or
storage-bucketed child keeps its bucket distribution and every other child is
bucket-shuffled to it, avoiding a full reshuffle of the largest input (the same
idea as bucket-shuffle join applied to set operations).

This is only valid under the FE local-shuffle planner
(enable_local_shuffle_planner): only then can the frontend plan the correct
local shuffle type for the set sink/probe. With the BE-side local-shuffle
planner the backend cannot infer the type and computes wrong results, so the
plan falls back to execution-bucketed shuffle there and behavior is unchanged.
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17621	4024	3989	3989
q2	2166	321	198	198
q3	10606	1455	829	829
q4	4742	480	337	337
q5	8140	860	592	592
q6	314	183	136	136
q7	882	846	621	621
q8	10679	1625	1685	1625
q9	6037	4472	4448	4448
q10	6834	1864	1512	1512
q11	515	347	326	326
q12	751	572	443	443
q13	18262	3477	2836	2836
q14	279	260	243	243
q15	q16	784	791	707	707
q17	1963	990	1062	990
q18	6984	5851	5659	5659
q19	2157	1529	1103	1103
q20	800	720	557	557
q21	6203	2805	2663	2663
q22	458	371	312	312
Total cold run time: 107177 ms
Total hot run time: 30126 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4862	5004	5139	5004
q2	319	325	212	212
q3	5123	5330	4374	4374
q4	2064	2157	1395	1395
q5	4404	4366	4304	4304
q6	223	176	119	119
q7	1723	1605	1410	1410
q8	2266	1965	1934	1934
q9	7280	7251	7253	7251
q10	4661	4660	4212	4212
q11	523	385	354	354
q12	736	750	531	531
q13	3013	3403	2783	2783
q14	271	284	260	260
q15	q16	678	699	621	621
q17	1294	1272	1259	1259
q18	7362	7202	6915	6915
q19	1118	1126	1137	1126
q20	2233	2230	1957	1957
q21	5329	4597	4480	4480
q22	504	469	408	408
Total cold run time: 55986 ms
Total hot run time: 50909 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 173676 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 b847f60ecf3f67a3ccacd464bf65bdc6c7dd9cf6, data reload: false

query5	4329	630	495	495
query6	456	217	212	212
query7	4837	570	345	345
query8	348	186	170	170
query9	8760	4026	4013	4013
query10	464	360	299	299
query11	5961	2371	2192	2192
query12	163	101	100	100
query13	1370	630	412	412
query14	6784	5343	4973	4973
query14_1	4307	4312	4319	4312
query15	210	203	186	186
query16	1028	454	471	454
query17	1167	791	577	577
query18	2727	465	338	338
query19	218	187	145	145
query20	110	106	108	106
query21	248	155	138	138
query22	13658	13726	13398	13398
query23	17294	16689	16188	16188
query23_1	16299	16297	16342	16297
query24	7556	1798	1313	1313
query24_1	1339	1304	1315	1304
query25	537	453	365	365
query26	1351	377	216	216
query27	2502	572	361	361
query28	4392	1971	1998	1971
query29	1078	636	476	476
query30	343	272	227	227
query31	1137	1095	1014	1014
query32	118	63	59	59
query33	528	305	251	251
query34	1212	1134	638	638
query35	790	779	681	681
query36	1449	1382	1228	1228
query37	160	108	90	90
query38	1898	1737	1656	1656
query39	927	934	897	897
query39_1	889	925	882	882
query40	253	171	142	142
query41	68	64	63	63
query42	94	95	94	94
query43	325	322	279	279
query44	1461	789	778	778
query45	219	192	188	188
query46	1044	1199	783	783
query47	2384	2389	2280	2280
query48	423	416	299	299
query49	597	424	333	333
query50	1026	443	356	356
query51	4415	4422	4274	4274
query52	89	88	79	79
query53	272	265	211	211
query54	323	264	232	232
query55	80	73	76	73
query56	332	339	296	296
query57	1495	1406	1305	1305
query58	325	271	259	259
query59	1618	1684	1469	1469
query60	308	277	250	250
query61	155	153	158	153
query62	691	654	585	585
query63	249	202	202	202
query64	2506	744	592	592
query65	4906	4834	4794	4794
query66	1792	513	389	389
query67	29811	29102	29604	29102
query68	3025	1527	926	926
query69	418	321	275	275
query70	1102	956	967	956
query71	369	331	312	312
query72	3079	2662	2297	2297
query73	870	764	449	449
query74	5193	4934	4772	4772
query75	2642	2579	2261	2261
query76	2320	1206	769	769
query77	340	382	294	294
query78	12560	12517	12028	12028
query79	1278	1138	735	735
query80	577	555	443	443
query81	462	336	280	280
query82	238	164	123	123
query83	321	322	293	293
query84	283	160	131	131
query85	937	626	510	510
query86	369	300	285	285
query87	1837	1838	1761	1761
query88	3748	2828	2839	2828
query89	445	409	358	358
query90	2138	205	200	200
query91	203	190	160	160
query92	65	58	59	58
query93	1516	1657	1077	1077
query94	568	366	319	319
query95	807	604	471	471
query96	1141	821	339	339
query97	2747	2660	2566	2566
query98	224	210	196	196
query99	1173	1147	1019	1019
Total cold run time: 259401 ms
Total hot run time: 173676 ms

@hello-stephen

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

query1	0.01	0.00	0.01
query2	0.10	0.05	0.05
query3	0.22	0.13	0.13
query4	1.04	0.13	0.13
query5	0.24	0.22	0.23
query6	1.09	1.09	1.00
query7	0.04	0.01	0.00
query8	0.05	0.03	0.04
query9	0.42	0.31	0.32
query10	0.56	0.57	0.53
query11	0.21	0.15	0.14
query12	0.19	0.15	0.14
query13	0.49	0.48	0.48
query14	1.05	1.04	1.01
query15	0.70	0.68	0.68
query16	0.32	0.32	0.34
query17	1.12	1.11	1.12
query18	0.24	0.21	0.22
query19	2.10	1.92	1.92
query20	0.02	0.01	0.01
query21	11.48	0.32	0.13
query22	3.22	0.05	0.05
query23	11.91	0.40	0.12
query24	2.06	0.42	0.18
query25	0.07	0.04	0.03
query26	0.56	0.23	0.16
query27	0.03	0.03	0.04
query28	2.82	1.11	0.59
query29	9.26	4.75	3.46
query30	0.25	0.15	0.16
query31	1.84	0.72	0.31
query32	3.25	0.63	0.51
query33	3.20	3.23	3.35
query34	11.23	5.86	5.44
query35	5.48	5.48	5.46
query36	0.53	0.45	0.46
query37	0.10	0.06	0.07
query38	0.04	0.04	0.03
query39	0.04	0.03	0.04
query40	0.18	0.17	0.16
query41	0.09	0.03	0.03
query42	0.06	0.03	0.03
query43	0.04	0.03	0.04
Total cold run time: 77.95 s
Total hot run time: 29.09 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.

3 participants