Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
d3d3048
Add StarRocks Parquet entries (single, partitioned) and Doris Parquet…
alexey-milovidov Aug 18, 2026
697d7a5
doris-parquet-single: wait for an alive BE before load and queries
alexey-milovidov Aug 18, 2026
88f59f2
Add benchmark results for starrocks-parquet, starrocks-parquet-partit…
github-actions[bot] Aug 18, 2026
73bb933
doris-parquet-single: bump to 4.1.0-rc01, dump BE crash log from ./check
alexey-milovidov Aug 18, 2026
3329a1e
Add benchmark results for starrocks-parquet, starrocks-parquet-partit…
github-actions[bot] Aug 18, 2026
d96620c
Add benchmark results for starrocks-parquet, starrocks-parquet-partit…
github-actions[bot] Aug 18, 2026
105d09d
doris-parquet-single: pin priority_networks, fix FE wait, harden diag…
alexey-milovidov Aug 18, 2026
a412130
doris-parquet-single: fix diagnose redirects, capture start_be.sh output
alexey-milovidov Aug 18, 2026
d93118b
doris-parquet-single: swapoff before starting the BE
alexey-milovidov Aug 19, 2026
b394147
Add benchmark results for doris-parquet-single (c6a.4xlarge)
github-actions[bot] Aug 19, 2026
5e962b3
Add benchmark results for doris-parquet-single, starrocks-parquet, st…
github-actions[bot] Aug 19, 2026
cf47f95
Add benchmark results for doris-parquet-single, starrocks-parquet, st…
github-actions[bot] Aug 19, 2026
023b851
Add benchmark results for starrocks-parquet, starrocks-parquet-partit…
github-actions[bot] Aug 19, 2026
aac1500
Add benchmark results for starrocks-parquet (t3a.small)
github-actions[bot] Aug 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions doris-parquet-single/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Doris Parquet (single)

Like [doris-parquet](../doris-parquet/), but over the single `hits.parquet`
file instead of the 100 partitioned files: a local Doris cluster with 1 FE and
1 BE queries the file in place through the `local()` table-valued function.

## References

- [doris-parquet](../doris-parquet/)
- [clickhouse-parquet](../clickhouse-parquet/)
- [duckdb-parquet](../duckdb-parquet/)
3 changes: 3 additions & 0 deletions doris-parquet-single/benchmark.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash
export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-single"
exec ../lib/benchmark-common.sh
44 changes: 44 additions & 0 deletions doris-parquet-single/check
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/bin/bash
set -e

# Print state that is otherwise invisible in the benchmark log (the harness
# shows only the last failing ./check stderr): the FE's view of the BE, the
# daemon launchers' own output (captured by ./start), and the BE's logs.
diagnose() {
mysql -h127.0.0.1 -P9030 -uroot -e 'SHOW BACKENDS\G' 2>/dev/null \
| grep -E 'Alive|ErrMsg|Version|LastHeartbeat|HeartbeatFailureCounter' >&2 || true
if pgrep -f doris_be >/dev/null 2>&1; then
echo "doris: BE process is running" >&2
else
echo "doris: BE process is NOT running" >&2
fi
echo "--- start_be.sh output:" >&2
cat start_be.out >&2 2>/dev/null || true
local doris_home
doris_home=$(cat .doris_home 2>/dev/null) || return 0
echo "--- be/log contents:" >&2
ls -la "$doris_home"/be/log/ >&2 2>/dev/null || true
echo "--- be.out tail:" >&2
tail -n 30 "$doris_home"/be/log/be.out >&2 2>/dev/null || true
echo "--- be.INFO tail:" >&2
tail -n 15 "$doris_home"/be/log/be.INFO >&2 2>/dev/null || true
echo "--- dmesg:" >&2
dmesg 2>/dev/null | grep -iE 'doris|segfault|oom|killed process' | tail -n 5 >&2 || true
}

# On Doris 4.x even `SELECT 1` is dispatched to a backend, so this fails
# with "No backend available as scan node" until a BE is alive — which is
# exactly the readiness this benchmark needs.
if ! err=$(mysql -h127.0.0.1 -P9030 -uroot -e 'SELECT 1' 2>&1 >/dev/null); then
echo "doris: SELECT 1 failed: ${err}" >&2
diagnose
exit 1
fi

if ! mysql -h127.0.0.1 -P9030 -uroot -B -e 'SHOW BACKENDS' 2>/dev/null \
| awk -F'\t' 'NR==1 { for (i = 1; i <= NF; i++) if ($i == "Alive") c = i; next }
c && tolower($c) == "true" { found = 1 } END { exit !found }'; then
echo "doris: FE is up but no BE is alive" >&2
diagnose
exit 1
fi
8 changes: 8 additions & 0 deletions doris-parquet-single/create.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
CREATE DATABASE IF NOT EXISTS hits;
CREATE VIEW IF NOT EXISTS hits.hits
AS
SELECT * FROM local(
"file_path" = "hits.parquet",
"shared_storage" = "true", -- omit "backend_id" = "be_id",
"format" = "parquet"
);
6 changes: 6 additions & 0 deletions doris-parquet-single/data-size
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash
set -e

DORIS_HOME=$(cat .doris_home)
find "$DORIS_HOME/be/" -name 'hits.parquet' -printf '%s\n' \
| awk '{ s += $1 } END { print s+0 }'
25 changes: 25 additions & 0 deletions doris-parquet-single/get-result-json.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash

# set -x
DATE=$(date -u +%Y-%m-%d)
YYYYMMDD=${DATE//-/}
MACHINE=$(sudo dmidecode -s system-product-name)
mkdir -p "results/${YYYYMMDD}"

echo -e "{
\"system\": \"Doris (Parquet, single)\",
\"date\": \"${DATE}\",
\"machine\": \"${MACHINE}\",
\"cluster_size\": 1,
\"comment\": \"\",
\"tags\": [\"C++\", \"column-oriented\", \"MySQL compatible\", \"ClickHouse derivative\"],
\"load_time\": 0,
\"data_size\": 14779976446,
\"result\": [
$(
r=$(sed -r -e 's/query[0-9]+,/[/; s/$/],/' result.csv)
echo "${r%?}"
)
]
}
" | tee "results/${YYYYMMDD}/${MACHINE}.json"
62 changes: 62 additions & 0 deletions doris-parquet-single/install
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/bin/bash
set -e

# Apache Doris only ships x64 release tarballs (apache-doris-*-bin-x64).
# No arm64 build exists on the public mirror, so c8g.* runs would
# download the x64 tarball, the BE process would refuse to come up
# ("No backend available"), and the bench would fail late after the
# 14 GB download. Fail fast on arm64 instead.
if [ "$(uname -m)" != "x86_64" ] && [ "$(uname -m)" != "amd64" ]; then
echo "doris-parquet-single: Apache Doris has no $(uname -m) release tarball; skipping" >&2
exit 1
fi

# This benchmark runs on Ubuntu 22.04+. Same 4.1.0-rc01 as the doris entry:
# the 3.0.5 BE that doris-parquet pins never becomes alive on the current
# Ubuntu 24.04 benchmark image.
ROOT=$(pwd)
URL='https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-4.1.0-rc01-bin-x64.tar.gz'

file_name="$(basename "$URL")"
dir_name="${file_name/.tar.gz/}"
DORIS_HOME="$ROOT/$dir_name/$dir_name"

# Idempotent: skip if already extracted.
if [ ! -d "$DORIS_HOME" ]; then
if [ ! -f "$file_name" ]; then
wget --continue --progress=dot:giga "$URL"
fi
mkdir -p "$dir_name"
tar zxf "$file_name" -C "$dir_name"

# Disable internal caches so cold runs are actually cold.
printf "\ndisable_storage_page_cache = true\n" >> "$DORIS_HOME"/be/conf/be.conf
printf "\nsegment_cache_capacity = 0\n" >> "$DORIS_HOME"/be/conf/be.conf

# Pin both daemons' self-detected address to loopback so the FE's saved
# BE address (ADD BACKEND '127.0.0.1:9050') matches what the BE reports
# in heartbeats. Without it the BE picks the instance's private IP and
# can stay Alive=false forever — same single-node pin the starrocks
# entry needs.
printf "\npriority_networks = 127.0.0.1/32\n" >> "$DORIS_HOME"/be/conf/be.conf
printf "\npriority_networks = 127.0.0.1/32\n" >> "$DORIS_HOME"/fe/conf/fe.conf
fi

# Install dependencies (idempotent — apt-get is fine to re-run).
sudo apt-get update -y
sudo apt-get install -y openjdk-17-jdk mysql-client bc

sudo systemctl disable unattended-upgrades 2>/dev/null || true
sudo systemctl stop unattended-upgrades 2>/dev/null || true

sudo sysctl -w vm.max_map_count=2000000

# cloud-init adds a 16 GB swapfile to every benchmark instance (f236e7ba2,
# 2026-05-09) for systems that load the dataset into RAM. Doris's
# start_be.sh hard-refuses to launch while swap is active ("Disable swap
# memory before starting be") — this is why no doris entry has produced
# results since that date. Parquet-in-place needs no swap headroom, so
# turn it off (persists until reboot; instances never reboot mid-run).
sudo swapoff -a

echo "$DORIS_HOME" > .doris_home
28 changes: 28 additions & 0 deletions doris-parquet-single/load
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/bin/bash
set -e

ROOT=$(pwd)
DORIS_HOME=$(cat .doris_home)
export DORIS_HOME

# The dataset must be visible to the BE process (the local() TVF reads files
# relative to the BE working dir). benchmark.sh already downloaded
# hits.parquet into this directory, so move it into the BE dir instead of
# downloading a second copy.
if [ -f "hits.parquet" ]; then
mv -f hits.parquet "$DORIS_HOME/be/"
elif [ ! -f "$DORIS_HOME/be/hits.parquet" ]; then
"$ROOT/../lib/download-hits-parquet-single" "$DORIS_HOME/be"
fi

# Create the view that wraps a local() TVF over the parquet file. Idempotent
# (CREATE OR REPLACE / IF NOT EXISTS).
mysql -h127.0.0.1 -P9030 -uroot < "$ROOT/create.sql"

# Pre-set parquet flags to match original benchmark.
mysql -h127.0.0.1 -P9030 -uroot \
-e 'set global enable_parquet_filter_by_min_max=true; set global enable_parquet_lazy_materialization=true;'

# Note: data files remain — for parquet-as-storage there's no separate copy,
# the TVF reads them directly.
sync
43 changes: 43 additions & 0 deletions doris-parquet-single/queries.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
SELECT COUNT(*) FROM hits;
SELECT COUNT(*) FROM hits WHERE AdvEngineID <> 0;
SELECT SUM(AdvEngineID), COUNT(*), AVG(ResolutionWidth) FROM hits;
SELECT AVG(UserID) FROM hits;
SELECT COUNT(DISTINCT UserID) FROM hits;
SELECT COUNT(DISTINCT SearchPhrase) FROM hits;
SELECT MIN(EventDate), MAX(EventDate) FROM hits;
SELECT AdvEngineID, COUNT(*) FROM hits WHERE AdvEngineID <> 0 GROUP BY AdvEngineID ORDER BY COUNT(*) DESC;
SELECT RegionID, COUNT(DISTINCT UserID) AS u FROM hits GROUP BY RegionID ORDER BY u DESC LIMIT 10;
SELECT RegionID, SUM(AdvEngineID), COUNT(*) AS c, AVG(ResolutionWidth), COUNT(DISTINCT UserID) FROM hits GROUP BY RegionID ORDER BY c DESC LIMIT 10;
SELECT MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhoneModel ORDER BY u DESC LIMIT 10;
SELECT MobilePhone, MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhone, MobilePhoneModel ORDER BY u DESC LIMIT 10;
SELECT SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10;
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
SELECT SearchEngineID, SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, SearchPhrase ORDER BY c DESC LIMIT 10;
SELECT UserID, COUNT(*) FROM hits GROUP BY UserID ORDER BY COUNT(*) DESC LIMIT 10;
SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10;
SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase LIMIT 10;
SELECT UserID, extract(minute FROM EventTime) AS m, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, m, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10;
SELECT UserID FROM hits WHERE UserID = 435090932899640449;
SELECT COUNT(*) FROM hits WHERE URL LIKE '%google%';
SELECT SearchPhrase, MIN(URL), COUNT(*) AS c FROM hits WHERE URL LIKE '%google%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10;
SELECT SearchPhrase, MIN(URL), MIN(Title), COUNT(*) AS c, COUNT(DISTINCT UserID) FROM hits WHERE Title LIKE '%Google%' AND URL NOT LIKE '%.google.%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10;
SELECT * FROM hits WHERE URL LIKE '%google%' ORDER BY EventTime LIMIT 10;
SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime LIMIT 10;
SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY SearchPhrase LIMIT 10;
SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime, SearchPhrase LIMIT 10;
SELECT CounterID, AVG(length(URL)) AS l, COUNT(*) AS c FROM hits WHERE URL <> '' GROUP BY CounterID HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25;
SELECT REGEXP_REPLACE(Referer, '^https?://(?:www\.)?([^/]+)/.*$', '\\1') AS k, AVG(length(Referer)) AS l, COUNT(*) AS c, MIN(Referer) FROM hits WHERE Referer <> '' GROUP BY k HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25;
SELECT SUM(ResolutionWidth), SUM(ResolutionWidth + 1), SUM(ResolutionWidth + 2), SUM(ResolutionWidth + 3), SUM(ResolutionWidth + 4), SUM(ResolutionWidth + 5), SUM(ResolutionWidth + 6), SUM(ResolutionWidth + 7), SUM(ResolutionWidth + 8), SUM(ResolutionWidth + 9), SUM(ResolutionWidth + 10), SUM(ResolutionWidth + 11), SUM(ResolutionWidth + 12), SUM(ResolutionWidth + 13), SUM(ResolutionWidth + 14), SUM(ResolutionWidth + 15), SUM(ResolutionWidth + 16), SUM(ResolutionWidth + 17), SUM(ResolutionWidth + 18), SUM(ResolutionWidth + 19), SUM(ResolutionWidth + 20), SUM(ResolutionWidth + 21), SUM(ResolutionWidth + 22), SUM(ResolutionWidth + 23), SUM(ResolutionWidth + 24), SUM(ResolutionWidth + 25), SUM(ResolutionWidth + 26), SUM(ResolutionWidth + 27), SUM(ResolutionWidth + 28), SUM(ResolutionWidth + 29), SUM(ResolutionWidth + 30), SUM(ResolutionWidth + 31), SUM(ResolutionWidth + 32), SUM(ResolutionWidth + 33), SUM(ResolutionWidth + 34), SUM(ResolutionWidth + 35), SUM(ResolutionWidth + 36), SUM(ResolutionWidth + 37), SUM(ResolutionWidth + 38), SUM(ResolutionWidth + 39), SUM(ResolutionWidth + 40), SUM(ResolutionWidth + 41), SUM(ResolutionWidth + 42), SUM(ResolutionWidth + 43), SUM(ResolutionWidth + 44), SUM(ResolutionWidth + 45), SUM(ResolutionWidth + 46), SUM(ResolutionWidth + 47), SUM(ResolutionWidth + 48), SUM(ResolutionWidth + 49), SUM(ResolutionWidth + 50), SUM(ResolutionWidth + 51), SUM(ResolutionWidth + 52), SUM(ResolutionWidth + 53), SUM(ResolutionWidth + 54), SUM(ResolutionWidth + 55), SUM(ResolutionWidth + 56), SUM(ResolutionWidth + 57), SUM(ResolutionWidth + 58), SUM(ResolutionWidth + 59), SUM(ResolutionWidth + 60), SUM(ResolutionWidth + 61), SUM(ResolutionWidth + 62), SUM(ResolutionWidth + 63), SUM(ResolutionWidth + 64), SUM(ResolutionWidth + 65), SUM(ResolutionWidth + 66), SUM(ResolutionWidth + 67), SUM(ResolutionWidth + 68), SUM(ResolutionWidth + 69), SUM(ResolutionWidth + 70), SUM(ResolutionWidth + 71), SUM(ResolutionWidth + 72), SUM(ResolutionWidth + 73), SUM(ResolutionWidth + 74), SUM(ResolutionWidth + 75), SUM(ResolutionWidth + 76), SUM(ResolutionWidth + 77), SUM(ResolutionWidth + 78), SUM(ResolutionWidth + 79), SUM(ResolutionWidth + 80), SUM(ResolutionWidth + 81), SUM(ResolutionWidth + 82), SUM(ResolutionWidth + 83), SUM(ResolutionWidth + 84), SUM(ResolutionWidth + 85), SUM(ResolutionWidth + 86), SUM(ResolutionWidth + 87), SUM(ResolutionWidth + 88), SUM(ResolutionWidth + 89) FROM hits;
SELECT SearchEngineID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, ClientIP ORDER BY c DESC LIMIT 10;
SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchPhrase <> '' GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10;
SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10;
SELECT URL, COUNT(*) AS c FROM hits GROUP BY URL ORDER BY c DESC LIMIT 10;
SELECT 1, URL, COUNT(*) AS c FROM hits GROUP BY 1, URL ORDER BY c DESC LIMIT 10;
SELECT ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3, COUNT(*) AS c FROM hits GROUP BY ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3 ORDER BY c DESC LIMIT 10;
SELECT URL, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND URL <> '' GROUP BY URL ORDER BY PageViews DESC LIMIT 10;
SELECT Title, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND Title <> '' GROUP BY Title ORDER BY PageViews DESC LIMIT 10;
SELECT URL, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND IsLink <> 0 AND IsDownload = 0 GROUP BY URL ORDER BY PageViews DESC LIMIT 10 OFFSET 1000;
SELECT TraficSourceID, SearchEngineID, AdvEngineID, CASE WHEN (SearchEngineID = 0 AND AdvEngineID = 0) THEN Referer ELSE '' END AS Src, URL AS Dst, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 GROUP BY TraficSourceID, SearchEngineID, AdvEngineID, Src, Dst ORDER BY PageViews DESC LIMIT 10 OFFSET 1000;
SELECT URLHash, EventDate, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND TraficSourceID IN (-1, 6) AND RefererHash = 3594120000172545465 GROUP BY URLHash, EventDate ORDER BY PageViews DESC LIMIT 10 OFFSET 100;
SELECT WindowClientWidth, WindowClientHeight, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND DontCountHits = 0 AND URLHash = 2868770270353813622 GROUP BY WindowClientWidth, WindowClientHeight ORDER BY PageViews DESC LIMIT 10 OFFSET 10000;
SELECT DATE_FORMAT(EventTime, '%Y-%m-%d %H:%i:00') AS M, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-14' AND EventDate <= '2013-07-15' AND IsRefresh = 0 AND DontCountHits = 0 GROUP BY DATE_FORMAT(EventTime, '%Y-%m-%d %H:%i:00') ORDER BY DATE_FORMAT(EventTime, '%Y-%m-%d %H:%i:00') LIMIT 10 OFFSET 1000;
33 changes: 33 additions & 0 deletions doris-parquet-single/query
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/bin/bash
# Reads a SQL query from stdin, runs it via mysql client against Doris's `hits` DB.
# Stdout: query result.
# Stderr: query runtime in fractional seconds on the last line.
# Exit non-zero on error.
set -e

query=$(cat)

# Clear the FE/BE caches before each query (parquet path).
curl -sS http://127.0.0.1:8040/api/clear_cache/all >/dev/null 2>&1 || true

out=$(mysql -vvv -h127.0.0.1 -P9030 -uroot hits -e "$query" 2>&1) || status=$?
status=${status:-0}

printf '%s\n' "$out" | grep -vP '^\([0-9.]+\s+sec\)$|rows? in set|Empty set'

if [ "$status" -ne 0 ] || printf '%s\n' "$out" | grep -qE '^ERROR'; then
printf '%s\n' "$out" >&2
exit 1
fi

secs=$(printf '%s\n' "$out" \
| grep -oP '\((?:([0-9.]+)\s+min\s+)?([0-9.]+)\s+sec\)' \
| tail -n1 \
| sed -r 's/\((([0-9.]+) min )?([0-9.]+) sec\)/\2 \3/' \
| awk '{ if ($2 != "") print $1*60 + $2; else print $1 }')

if [ -z "$secs" ]; then
echo "no timing in mysql output" >&2
exit 1
fi
printf '%s\n' "$secs" >&2
60 changes: 60 additions & 0 deletions doris-parquet-single/results/20260819/c6a.2xlarge.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"system": "Doris (Parquet, single)",
"date": "2026-08-19",
"machine": "c6a.2xlarge",
"cluster_size": 1,
"proprietary": "no",
"hardware": "cpu",
"tuned": "no",
"tags": ["C++","column-oriented","MySQL compatible","ClickHouse derivative","stateless"],
"load_time": 4,
"data_size": 14779976446,
"concurrent_qps": 0.293,
"concurrent_error_ratio": 0.997,
"result": [
[0.9, 0.67, 0.6],
[0.89, 0.59, 0.55],
[1, 0.67, 0.55],
[1.21, 0.65, 0.65],
[1.89, 1.24, 1.3],
[2.36, 1.92, 1.91],
[1.08, 0.59, 0.57],
[1.02, 0.58, 0.55],
[1.97, 1.45, 1.44],
[2.24, 1.75, 1.79],
[1.28, 0.85, 0.81],
[1.22, 0.88, 0.86],
[2.23, 1.65, 1.57],
[3.29, 2.4, 2.59],
[2.56, 1.92, 1.92],
[2.24, 1.98, 2],
[4.69, 4.31, 4.26],
[2.7, 1.11, 1.08],
[6.22, 5.16, 5.06],
[0.81, 0.32, 0.29],
[10.22, 2.04, 1.93],
[11.94, 2.24, 2.12],
[22.84, 3.85, 3.8],
[13.63, 2.59, 2.44],
[3.35, 1.35, 1.25],
[1.52, 1.24, 1.23],
[3.19, 1.37, 1.36],
[10.29, 2.66, 2.57],
[18.91, 18.38, 18.23],
[1.18, 0.67, 0.63],
[3.59, 1.65, 1.66],
[7.07, 2.15, 2.04],
[8.69, 7.93, 8.28],
[10.95, 7.76, 7.65],
[10.92, 7.98, 7.82],
[2.16, 1.59, 1.57],
[0.3, 0.09, 0.08],
[0.29, 0.09, 0.09],
[0.29, 0.08, 0.08],
[0.32, 0.07, 0.08],
[0.29, 0.07, 0.09],
[0.3, 0.1, 0.08],
[0.29, 0.09, 0.09]
]
}

60 changes: 60 additions & 0 deletions doris-parquet-single/results/20260819/c6a.4xlarge.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"system": "Doris (Parquet, single)",
"date": "2026-08-19",
"machine": "c6a.4xlarge",
"cluster_size": 1,
"proprietary": "no",
"hardware": "cpu",
"tuned": "no",
"tags": ["C++","column-oriented","MySQL compatible","ClickHouse derivative","stateless"],
"load_time": 10,
"data_size": 14779976446,
"concurrent_qps": 0.827,
"concurrent_error_ratio": 0.116,
"result": [
[0.65, 0.54, 0.74],
[0.78, 0.64, 0.7],
[0.78, 0.53, 0.62],
[0.87, 0.88, 0.82],
[1.21, 0.85, 1.16],
[1.7, 1.62, 2.02],
[0.75, 0.63, 0.74],
[0.8, 0.51, 0.69],
[1.4, 1.1, 0.98],
[1.61, 1.16, 1.35],
[1.08, 0.88, 0.61],
[1.08, 0.82, 0.73],
[1.52, 1.1, 1.41],
[2.95, 1.6, 1.8],
[1.79, 1.39, 1.62],
[1.48, 1.24, 1.4],
[3.61, 3.16, 3.18],
[2.63, 0.8, 1.06],
[5.72, 3.59, 3.38],
[0.71, 0.26, 0.21],
[10.15, 1.51, 1.57],
[11.86, 1.99, 1.96],
[22.72, 3.66, 3.71],
[13.59, 2.14, 1.95],
[3.21, 1.04, 1.18],
[1.33, 0.78, 1.08],
[3.21, 0.94, 1.2],
[10.27, 2.41, 2.27],
[12.43, 9.58, 9.95],
[1.02, 0.68, 0.74],
[3.38, 1.03, 1.41],
[6.92, 1.77, 1.84],
[6.85, 5.34, 5.24],
[11.04, 6.27, 6.27],
[10.7, 6.33, 6.16],
[1.4, 1.11, 1.29],
[0.27, 0.09, 0.08],
[0.27, 0.09, 0.08],
[0.29, 0.08, 0.07],
[0.28, 0.09, 0.07],
[0.29, 0.1, 0.09],
[0.29, 0.09, 0.1],
[0.31, 0.1, 0.09]
]
}

Loading