This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git
The following commit(s) were added to refs/heads/master by this push:
new bf546609fd0 [refactor](next) add benckmark landing page (#3647)
bf546609fd0 is described below
commit bf546609fd0f51e229d6a26e7f8282a7877e48d5
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Thu May 14 14:28:13 2026 -0700
[refactor](next) add benckmark landing page (#3647)
---
src/components/home-next/NavbarNext.tsx | 2 +-
src/components/why-doris-next/BenchmarkNext.scss | 1290 +++++++++++++++++++++
src/components/why-doris-next/BenchmarkNext.tsx | 815 ++++++++++++++
src/constant/benchmark.data.json | 1308 ++++++++++++++++++++++
src/pages/why-doris/benchmarks/index.tsx | 6 +
5 files changed, 3420 insertions(+), 1 deletion(-)
diff --git a/src/components/home-next/NavbarNext.tsx
b/src/components/home-next/NavbarNext.tsx
index 881c1b81b96..996e59b261e 100644
--- a/src/components/home-next/NavbarNext.tsx
+++ b/src/components/home-next/NavbarNext.tsx
@@ -36,7 +36,7 @@ function buildNavItems(docsHref: string, releasesHref:
string): NavItem[] {
label: 'Why Doris',
items: [
{ label: 'Doris vs. Others', href: '/why-doris/compare' },
- { label: 'Benchmarks (coming soon)', href: '#' },
+ { label: 'Benchmarks', href: '/why-doris/benchmarks' },
{ label: 'Key Features', href: '/why-doris/key-features' },
{ label: 'User Stories (coming soon)', href: '#' },
],
diff --git a/src/components/why-doris-next/BenchmarkNext.scss
b/src/components/why-doris-next/BenchmarkNext.scss
new file mode 100644
index 00000000000..9a432ae36d7
--- /dev/null
+++ b/src/components/why-doris-next/BenchmarkNext.scss
@@ -0,0 +1,1290 @@
+// Benchmark landing page — fully scoped under `.bench-next` so the prototype's
+// `b-*` selectors don't collide with the rest of the site.
+
+.bench-next {
+ // ── Tokens (mirrors prototype/v14-benchmark/tsx/src/styles/_tokens.scss)
+ --bn-green: #11A679;
+ --bn-green-deep: #0B7A58;
+ --bn-green-dark: #06805F;
+ --bn-green-darker: #054C39;
+ --bn-green-darkest: #033A2C;
+ --bn-green-tint: #1FBF8E;
+ --bn-green-glow: #2DDFA8;
+
+ --bn-cream: #F5EFE4;
+ --bn-cream-light: #FAF6EE;
+ --bn-cream-warm: #EFE6D2;
+ --bn-paper: #FFFCF5;
+
+ --bn-yellow: #FFD23F;
+ --bn-yellow-bright: #FFE066;
+ --bn-coral: #FF5C39;
+
+ --bn-ink: #0F1A14;
+ --bn-ink-soft: #1B2A22;
+
+ --bn-mono: 'JetBrains Mono', 'IBM Plex Mono', ui-monospace,
SFMono-Regular, Menlo, monospace;
+ --bn-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI',
sans-serif;
+
+ --bn-container: 1320px;
+ --bn-gutter: 56px;
+
+ position: relative;
+ background: var(--bn-green-dark);
+ color: var(--bn-cream-light);
+ font-family: var(--bn-sans);
+ overflow-x: hidden;
+
+ * { box-sizing: border-box; }
+
+ img { max-width: 100%; display: block; }
+ a { color: inherit; }
+
+ // ── Layout helpers
+ .b-container {
+ max-width: var(--bn-container);
+ margin: 0 auto;
+ padding: 0 var(--bn-gutter);
+ width: 100%;
+ }
+
+ .b-accent { color: var(--bn-yellow); }
+
+ .b-eyebrow {
+ display: inline-flex;
+ align-items: center;
+ gap: 12px;
+ font-family: var(--bn-mono);
+ font-size: 12px;
+ font-weight: 500;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+ color: rgba(245, 239, 228, 0.7);
+ flex-wrap: wrap;
+ }
+
+ .b-eyebrow-line {
+ display: inline-block;
+ width: 28px;
+ height: 1.5px;
+ background: var(--bn-yellow);
+ flex-shrink: 0;
+ }
+
+ .b-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.6rem;
+ padding: 0.95rem 1.5rem;
+ font-family: var(--bn-mono);
+ font-size: 14px;
+ font-weight: 600;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+ border-radius: 4px;
+ border: 1.5px solid transparent;
+ cursor: pointer;
+ transition: transform 0.15s ease, background 0.15s ease, border-color
0.15s ease;
+ text-decoration: none;
+ white-space: nowrap;
+
+ &:hover {
+ transform: translateY(-1px);
+ text-decoration: none;
+ }
+ }
+
+ .b-btn-yellow {
+ background: var(--bn-yellow);
+ color: var(--bn-ink);
+ border-color: var(--bn-yellow);
+
+ &:hover { background: var(--bn-yellow-bright); }
+ }
+
+ .b-btn-primary {
+ background: var(--bn-cream-light);
+ color: var(--bn-green-darker);
+ border-color: var(--bn-cream-light);
+
+ &:hover { background: var(--bn-paper); }
+ }
+
+ .b-btn:disabled,
+ .b-btn[aria-disabled='true'] {
+ cursor: not-allowed;
+ opacity: 0.55;
+
+ &:hover {
+ transform: none;
+ background: var(--bn-cream-light);
+ }
+ }
+
+ .b-shape {
+ position: absolute;
+ pointer-events: none;
+ z-index: 1;
+ }
+
+ .b-shape-diamond {
+ width: 16px;
+ height: 16px;
+ background: var(--bn-yellow);
+ transform: rotate(45deg);
+ }
+
+ .b-shape-circle {
+ width: 14px;
+ height: 14px;
+ border-radius: 50%;
+ background: var(--bn-coral);
+ }
+
+ .b-shape-ring {
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ border: 2px solid var(--bn-yellow);
+ }
+
+ .b-shape-cross {
+ width: 18px;
+ height: 18px;
+ position: absolute;
+
+ &::before,
+ &::after {
+ content: '';
+ position: absolute;
+ background: var(--bn-cream-light);
+ inset: 0;
+ }
+
+ &::before {
+ width: 100%;
+ height: 2px;
+ top: 50%;
+ transform: translateY(-50%);
+ }
+
+ &::after {
+ height: 100%;
+ width: 2px;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+
+ // ── Reveal-on-scroll
+ [data-reveal],
+ [data-reveal-local] {
+ opacity: 0;
+ transform: translateY(24px);
+ transition:
+ opacity 0.7s cubic-bezier(.2, .8, .2, 1),
+ transform 0.7s cubic-bezier(.2, .8, .2, 1);
+
+ &.is-visible {
+ opacity: 1;
+ transform: none;
+ }
+ }
+
+ [data-reveal-delay='1'] { transition-delay: 0.08s; }
+ [data-reveal-delay='2'] { transition-delay: 0.16s; }
+ [data-reveal-delay='3'] { transition-delay: 0.24s; }
+
+ //
─────────────────────────────────────────────────────────────────────────
+ // Hero
+ //
─────────────────────────────────────────────────────────────────────────
+ .b-hero {
+ position: relative;
+ background: var(--bn-green-dark);
+ overflow: hidden;
+ padding: 72px 0;
+
+ .b-hero-inner { position: relative; z-index: 5; }
+
+ .b-hero-title {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: -0.035em;
+ word-spacing: -0.18em;
+ line-height: 0.92;
+ color: var(--bn-cream-light);
+ margin: 0;
+ font-size: clamp(40px, 4.4vw, 62px);
+
+ .b-accent { color: var(--bn-yellow); }
+ }
+
+ .b-hero-sub {
+ font-family: var(--bn-sans);
+ font-size: 15px;
+ line-height: 1.5;
+ word-spacing: -0.12em;
+ color: rgba(245, 239, 228, 0.85);
+ margin: 18px 0 0;
+ max-width: 540px;
+ font-weight: 400;
+ }
+
+ .b-hero-link {
+ color: var(--bn-cream-light);
+ text-decoration: none;
+ border-bottom: 1px solid rgba(255, 210, 63, 0.45);
+ padding-bottom: 1px;
+ transition: color 0.15s ease, border-color 0.15s ease;
+
+ &:hover {
+ color: var(--bn-yellow);
+ border-bottom-color: var(--bn-yellow);
+ text-decoration: none;
+ }
+ }
+ }
+
+ //
─────────────────────────────────────────────────────────────────────────
+ // Comparison
+ //
─────────────────────────────────────────────────────────────────────────
+ .b-cmp {
+ background: var(--bn-cream-light);
+ color: var(--bn-ink);
+ padding: 72px 0;
+ position: relative;
+ overflow: hidden;
+
+ .b-cmp-bggrid {
+ position: absolute;
+ inset: 0;
+ background-image: radial-gradient(rgba(15, 26, 20, 0.07) 1.2px,
transparent 1.2px);
+ background-size: 32px 32px;
+ mask-image: linear-gradient(180deg, transparent, black 18%, black
82%, transparent);
+ -webkit-mask-image: linear-gradient(180deg, transparent, black
18%, black 82%, transparent);
+ }
+
+ .b-cmp-head {
+ max-width: 760px;
+ margin-bottom: 56px;
+ position: relative;
+ z-index: 2;
+
+ .b-eyebrow {
+ margin-bottom: 22px;
+ color: rgba(15, 26, 20, 0.62);
+ }
+
+ .b-eyebrow-line { background: var(--bn-green-deep); }
+ }
+ }
+
+ .b-cmp-title {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ text-transform: uppercase;
+ font-size: clamp(36px, 4.2vw, 56px);
+ line-height: 0.95;
+ letter-spacing: -0.035em;
+ word-spacing: -0.18em;
+ color: var(--bn-ink);
+ margin: 0 0 22px;
+ }
+
+ .b-cmp-sub {
+ font-size: 15px;
+ line-height: 1.6;
+ word-spacing: -0.12em;
+ color: rgba(15, 26, 20, 0.70);
+ max-width: 620px;
+ margin: 0;
+ }
+
+
+ .b-tabs {
+ display: flex;
+ gap: 0;
+ border-bottom: 1px solid rgba(15, 26, 20, 0.14);
+ margin-bottom: 36px;
+ flex-wrap: wrap;
+ position: relative;
+ z-index: 2;
+ }
+
+ .b-tab {
+ font-family: var(--bn-mono);
+ font-size: 12.5px;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ color: rgba(15, 26, 20, 0.55);
+ background: none;
+ border: 0;
+ padding: 18px 26px;
+ cursor: pointer;
+ position: relative;
+ white-space: nowrap;
+ transition: color 0.18s ease;
+
+ &:hover { color: var(--bn-ink); }
+
+ &:hover .b-tab-tip,
+ &:focus-visible .b-tab-tip {
+ opacity: 1;
+ transform: translateX(-50%) translateY(0);
+ }
+
+ &.is-active {
+ color: var(--bn-ink);
+
+ &::after {
+ content: '';
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: -1px;
+ height: 2px;
+ background: var(--bn-green-deep);
+ }
+
+ .b-tab-count { color: var(--bn-green-deep); }
+ }
+ }
+
+ .b-tab-tip {
+ position: absolute;
+ bottom: calc(100% + 10px);
+ left: 50%;
+ transform: translateX(-50%) translateY(4px);
+ width: 280px;
+ padding: 12px 14px;
+ background: var(--bn-ink);
+ color: rgba(245, 239, 228, 0.92);
+ font-family: var(--bn-sans);
+ font-size: 12.5px;
+ font-weight: 400;
+ letter-spacing: 0;
+ text-transform: none;
+ line-height: 1.5;
+ text-align: left;
+ border-radius: 6px;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.18s ease, transform 0.18s ease;
+ z-index: 10;
+ box-shadow: 0 14px 36px -18px rgba(15, 26, 20, 0.55);
+ white-space: normal;
+
+ &::after {
+ content: '';
+ position: absolute;
+ top: 100%;
+ left: 50%;
+ transform: translateX(-50%);
+ border: 6px solid transparent;
+ border-top-color: var(--bn-ink);
+ }
+ }
+
+ .b-sum-row {
+ display: grid;
+ gap: 20px;
+ position: relative;
+ z-index: 2;
+
+ &.is-cols-3 { grid-template-columns: repeat(3, 1fr); }
+ &.is-cols-2 { grid-template-columns: repeat(2, 1fr); }
+ }
+
+ .b-card {
+ background: var(--bn-paper);
+ border: 1px solid rgba(15, 26, 20, 0.10);
+ border-radius: 12px;
+ padding: 30px 28px 26px;
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+ text-align: left;
+ color: inherit;
+ font: inherit;
+ position: relative;
+ transition:
+ background 0.25s ease,
+ border-color 0.25s ease,
+ box-shadow 0.25s ease,
+ transform 0.25s ease;
+
+ &:hover {
+ background: var(--bn-paper);
+ border-color: rgba(15, 26, 20, 0.22);
+ box-shadow: 0 12px 32px -16px rgba(15, 26, 20, 0.20);
+ transform: translateY(-2px);
+ }
+
+ &.is-active {
+ background: var(--bn-paper);
+ border-color: var(--bn-green-deep);
+ box-shadow:
+ 0 0 0 1px var(--bn-green-deep) inset,
+ 0 14px 36px -20px rgba(11, 122, 88, 0.45);
+
+ &::after {
+ content: '';
+ position: absolute;
+ left: 50%;
+ bottom: -10px;
+ width: 18px;
+ height: 18px;
+ background: var(--bn-paper);
+ border-right: 1px solid var(--bn-green-deep);
+ border-bottom: 1px solid var(--bn-green-deep);
+ transform: translateX(-50%) rotate(45deg);
+ z-index: 3;
+ }
+
+ .b-card-tip { color: var(--bn-green-deep); }
+ }
+ }
+
+ .b-card-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 6px;
+ }
+
+ .b-card-title {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ text-transform: uppercase;
+ font-size: 22px;
+ line-height: 1.12;
+ letter-spacing: -0.005em;
+ color: var(--bn-ink);
+ margin: 0;
+ }
+
+ .b-card-tag {
+ font-family: var(--bn-mono);
+ font-size: 10.5px;
+ letter-spacing: 0.16em;
+ text-transform: uppercase;
+ color: rgba(15, 26, 20, 0.50);
+ padding-top: 6px;
+ }
+
+ .b-card-metric {
+ font-family: var(--bn-mono);
+ font-size: 11px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: rgba(15, 26, 20, 0.50);
+ margin: 0 0 16px;
+ }
+
+ .b-bars {
+ display: grid;
+ gap: 11px;
+ margin: 6px 0 18px;
+ }
+
+ .b-bar {
+ display: grid;
+ grid-template-columns: 120px 1fr 88px;
+ gap: 14px;
+ align-items: center;
+ font-family: var(--bn-mono);
+ font-size: 12.5px;
+
+ &.is-doris {
+ .b-bar-label {
+ color: var(--bn-green-deep);
+ font-weight: 700;
+ }
+ .b-bar-fill { background: var(--bn-green-deep); }
+ .b-bar-value {
+ color: var(--bn-green-deep);
+ font-weight: 700;
+ }
+ }
+ }
+
+ .b-bar-label {
+ color: rgba(15, 26, 20, 0.78);
+ letter-spacing: 0.02em;
+ display: flex;
+ align-items: center;
+ gap: 0;
+ min-width: 0;
+
+ span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ .b-bar-partial {
+ display: inline-block;
+ font-family: var(--bn-mono);
+ font-size: 10.5px;
+ font-weight: 700;
+ letter-spacing: 0.02em;
+ vertical-align: 1px;
+ }
+
+ .b-bar-track {
+ height: 10px;
+ background: rgba(15, 26, 20, 0.08);
+ position: relative;
+ border-radius: 1px;
+ overflow: hidden;
+ }
+
+ .b-bar-fill {
+ position: absolute;
+ inset: 0 auto 0 0;
+ background: rgba(15, 26, 20, 0.28);
+ border-radius: 1px;
+ width: 0;
+ transition: width 0.8s cubic-bezier(.2, .8, .2, 1);
+ }
+
+ .b-bar-value {
+ text-align: right;
+ color: var(--bn-ink);
+ font-variant-numeric: tabular-nums;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ gap: 6px;
+ }
+
+ .b-card-desc {
+ margin-top: auto;
+ padding: 14px 0 0;
+ border-top: 1px dashed rgba(15, 26, 20, 0.20);
+ font-family: var(--bn-sans);
+ font-size: 13.5px;
+ line-height: 1.55;
+ color: rgba(15, 26, 20, 0.72);
+ }
+
+ .b-card-note {
+ margin-top: auto;
+ margin-bottom: 12px;
+ font-family: var(--bn-sans);
+ font-size: 12px;
+ line-height: 1.5;
+ font-style: italic;
+ color: rgba(15, 26, 20, 0.55);
+ }
+
+ .b-card-note + .b-card-desc { margin-top: 0; }
+
+ .b-card-tip {
+ margin-top: 16px;
+ font-family: var(--bn-mono);
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+ color: var(--bn-green-deep);
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ transform-origin: left center;
+ animation: b-card-tip-breath 1.8s ease-in-out infinite;
+ }
+
+ @keyframes b-card-tip-breath {
+ 0%, 100% { transform: scale(1); }
+ 50% { transform: scale(1.05); }
+ }
+
+ .b-card:hover .b-card-tip,
+ .b-card.is-active .b-card-tip {
+ animation: none;
+ transform: scale(1);
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ .b-card-tip { animation: none; }
+ }
+
+ // ── Detail strip
+ .b-detail {
+ margin-top: 30px;
+ border: 1px solid var(--bn-green-deep);
+ border-radius: 12px;
+ background: var(--bn-paper);
+ padding: 32px 32px 28px;
+ position: relative;
+ z-index: 2;
+ overflow: hidden;
+ box-shadow: 0 18px 44px -24px rgba(11, 122, 88, 0.35);
+ animation: b-detail-enter 0.5s cubic-bezier(.2, .8, .2, 1);
+ }
+
+ @keyframes b-detail-enter {
+ from { opacity: 0; transform: translateY(-12px); }
+ to { opacity: 1; transform: none; }
+ }
+
+ .b-detail-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 24px;
+ flex-wrap: wrap;
+ margin-bottom: 24px;
+ }
+
+ .b-detail-title {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ text-transform: uppercase;
+ font-size: 22px;
+ line-height: 1.12;
+ letter-spacing: -0.005em;
+ color: var(--bn-ink);
+ margin: 0;
+ display: flex;
+ align-items: baseline;
+ gap: 14px;
+ flex-wrap: wrap;
+
+ .b-detail-title-sub {
+ font-family: var(--bn-mono);
+ font-size: 11px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: rgba(15, 26, 20, 0.52);
+ font-weight: 500;
+ }
+ }
+
+ .b-detail-legend {
+ display: flex;
+ gap: 18px;
+ font-family: var(--bn-mono);
+ font-size: 11px;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ color: rgba(15, 26, 20, 0.68);
+ flex-wrap: wrap;
+ }
+
+ .b-detail-legend-item {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ }
+
+ .b-detail-legend-swatch {
+ width: 11px;
+ height: 11px;
+ border-radius: 1px;
+ display: inline-block;
+ }
+
+ .b-detail-scroll {
+ overflow-x: auto;
+ overflow-y: hidden;
+ border: 1px solid rgba(15, 26, 20, 0.10);
+ border-radius: 8px;
+ background: var(--bn-cream-light);
+
+ &::-webkit-scrollbar { height: 10px; }
+ &::-webkit-scrollbar-track { background: rgba(15, 26, 20, 0.06); }
+ &::-webkit-scrollbar-thumb {
+ background: rgba(15, 26, 20, 0.22);
+ border-radius: 5px;
+ }
+ }
+
+ .b-chart {
+ position: relative;
+ padding: 24px 24px 18px;
+ }
+
+ .b-chart-grid {
+ position: absolute;
+ left: 60px;
+ right: 24px;
+ top: 24px;
+ bottom: 40px;
+ border-bottom: 1px solid rgba(15, 26, 20, 0.22);
+ background-image: linear-gradient(rgba(15, 26, 20, 0.08) 1px,
transparent 1px);
+ background-size: 100% 25%;
+ background-position: 0 0;
+ }
+
+ .b-chart-yaxis {
+ position: absolute;
+ left: 0;
+ top: 24px;
+ bottom: 40px;
+ width: 54px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: flex-end;
+ font-family: var(--bn-mono);
+ font-size: 10px;
+ color: rgba(15, 26, 20, 0.55);
+ letter-spacing: 0.06em;
+ padding-right: 6px;
+
+ span { transform: translateY(50%); }
+ span:first-child { transform: translateY(-2px); }
+ span:last-child { transform: translateY(2px); }
+ }
+
+ .b-chart-body {
+ position: relative;
+ margin-left: 60px;
+ display: flex;
+ align-items: flex-end;
+ gap: 6px;
+ height: 252px;
+ }
+
+ .b-cluster {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ flex: 0 0 auto;
+ }
+
+ .b-cluster-bars {
+ display: flex;
+ align-items: flex-end;
+ gap: 2px;
+ height: 230px;
+ }
+
+ .b-cluster-bar {
+ width: 8px;
+ background: rgba(15, 26, 20, 0.35);
+ border-radius: 1px 1px 0 0;
+ height: 0;
+ transition: height 0.7s cubic-bezier(.2, .8, .2, 1);
+ position: relative;
+ cursor: default;
+
+ &.is-doris { background: var(--bn-green-deep); }
+
+ &.is-failed {
+ background: transparent;
+ border: 1px dashed rgba(255, 92, 57, 0.65);
+ background-image: repeating-linear-gradient(
+ 45deg,
+ transparent 0 3px,
+ rgba(255, 92, 57, 0.40) 3px 6px
+ );
+ min-height: 0;
+
+ .b-cluster-bar-tip { color: var(--bn-coral); }
+ }
+
+ &:hover {
+ filter: brightness(1.06);
+ z-index: 20;
+
+ .b-cluster-bar-tip {
+ opacity: 1;
+ transform: translate(-50%, -110%);
+ }
+ }
+ }
+
+ .b-cluster-bar-tip {
+ position: absolute;
+ left: 50%;
+ top: 0;
+ transform: translate(-50%, -100%);
+ background: var(--bn-ink);
+ color: var(--bn-cream-light);
+ font-family: var(--bn-mono);
+ font-size: 11px;
+ padding: 5px 9px;
+ border-radius: 4px;
+ white-space: nowrap;
+ pointer-events: none;
+ opacity: 0;
+ transition: opacity 0.15s, transform 0.15s;
+ border: 1px solid rgba(15, 26, 20, 0.40);
+ z-index: 10;
+ }
+
+ .b-cluster-label {
+ margin-top: 6px;
+ font-family: var(--bn-mono);
+ font-size: 10px;
+ letter-spacing: 0.02em;
+ color: rgba(15, 26, 20, 0.58);
+ height: 16px;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .b-detail-env {
+ margin-top: 18px;
+ font-family: var(--bn-mono);
+ font-size: 12px;
+ letter-spacing: 0.02em;
+ line-height: 1.6;
+ color: rgba(15, 26, 20, 0.70);
+ padding: 14px 18px;
+ background: var(--bn-cream-light);
+ border-radius: 6px;
+ border-left: 2px solid var(--bn-green-deep);
+ }
+
+ .b-detail-env-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .b-detail-env-prod {
+ display: block;
+
+ &.is-doris .b-detail-env-prod-name {
+ color: var(--bn-green-deep);
+ font-weight: 700;
+ }
+ }
+
+ .b-detail-env-prod-name { color: var(--bn-ink); }
+ .b-detail-env-partial { color: var(--bn-coral); }
+
+ .b-detail-foot {
+ margin-top: 14px;
+ font-family: var(--bn-mono);
+ font-size: 11.5px;
+ color: rgba(15, 26, 20, 0.58);
+ }
+
+ //
─────────────────────────────────────────────────────────────────────────
+ // Reproduce
+ //
─────────────────────────────────────────────────────────────────────────
+ .b-repro {
+ background: var(--bn-green-dark);
+ border-top: 1px solid rgba(245, 239, 228, 0.06);
+ padding: 72px 0;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .b-repro-head {
+ max-width: 760px;
+ margin-bottom: 40px;
+ position: relative;
+ z-index: 2;
+
+ .b-eyebrow { margin-bottom: 22px; }
+ }
+
+ .b-method {
+ position: relative;
+ z-index: 2;
+ margin-bottom: 48px;
+ padding: 26px 28px 22px;
+ border: 1px solid rgba(245, 239, 228, 0.10);
+ border-radius: 10px;
+ background: rgba(0, 0, 0, 0.18);
+ }
+
+ .b-method-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 16px;
+ flex-wrap: wrap;
+ margin-bottom: 22px;
+ padding-bottom: 16px;
+ border-bottom: 1px solid rgba(245, 239, 228, 0.10);
+ }
+
+ .b-method-link {
+ font-family: var(--bn-mono);
+ font-size: 12px;
+ font-weight: 600;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ color: var(--bn-yellow);
+ text-decoration: none;
+ border-bottom: 1px solid rgba(255, 210, 63, 0.35);
+ padding-bottom: 2px;
+ transition: color 0.15s ease, border-color 0.15s ease;
+
+ &:hover {
+ color: var(--bn-yellow-bright);
+ border-color: var(--bn-yellow);
+ text-decoration: none;
+ }
+ }
+
+ .b-method-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 22px 32px;
+ }
+
+ .b-method-item {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ .b-method-label {
+ font-family: var(--bn-mono);
+ font-size: 11px;
+ font-weight: 700;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: var(--bn-yellow);
+ }
+
+ .b-method-body {
+ font-family: var(--bn-sans);
+ font-size: 13.5px;
+ line-height: 1.55;
+ color: rgba(245, 239, 228, 0.82);
+ }
+
+ .b-repro-title {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ text-transform: uppercase;
+ font-size: clamp(36px, 4.2vw, 56px);
+ line-height: 0.95;
+ letter-spacing: -0.035em;
+ word-spacing: -0.18em;
+ color: var(--bn-cream-light);
+ margin: 0 0 22px;
+ }
+
+ .b-repro-sub {
+ font-size: 15px;
+ line-height: 1.6;
+ word-spacing: -0.12em;
+ color: rgba(245, 239, 228, 0.85);
+ max-width: 620px;
+ margin: 0;
+ }
+
+ .b-repro-grid {
+ display: grid;
+ grid-template-columns: 2fr 3fr;
+ gap: 24px;
+ align-items: stretch;
+ position: relative;
+ z-index: 2;
+ }
+
+ .b-steps {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+ }
+
+ .b-step {
+ display: grid;
+ grid-template-columns: 48px 1fr;
+ gap: 18px;
+ padding: 22px 24px;
+ border: 1px solid rgba(245, 239, 228, 0.10);
+ border-radius: 10px;
+ background: rgba(0, 0, 0, 0.16);
+ cursor: pointer;
+ text-align: left;
+ color: inherit;
+ font: inherit;
+ transition: background 0.2s, border-color 0.2s;
+ flex: 1;
+
+ &:hover {
+ background: rgba(0, 0, 0, 0.24);
+ border-color: rgba(245, 239, 228, 0.18);
+ }
+
+ &.is-active {
+ background: rgba(255, 210, 63, 0.06);
+ border-color: rgba(255, 210, 63, 0.45);
+ box-shadow: 0 0 0 1px rgba(255, 210, 63, 0.25) inset;
+
+ .b-step-num { color: var(--bn-yellow); }
+ }
+ }
+
+ .b-step-num {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ font-size: 24px;
+ color: rgba(245, 239, 228, 0.55);
+ line-height: 1;
+ font-variant-numeric: tabular-nums;
+ }
+
+ .b-step-title {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ text-transform: uppercase;
+ font-size: 14px;
+ letter-spacing: 0.02em;
+ color: var(--bn-cream-light);
+ margin: 0 0 6px;
+ }
+
+ .b-step-body {
+ font-family: var(--bn-sans);
+ font-size: 14px;
+ line-height: 1.55;
+ color: rgba(245, 239, 228, 0.72);
+ margin: 0;
+ }
+
+ .b-term {
+ position: relative;
+ border: 1px solid rgba(245, 239, 228, 0.10);
+ border-radius: 10px;
+ background: #0A0E0C;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ box-shadow:
+ 0 24px 60px -28px rgba(0, 0, 0, 0.55),
+ 0 0 0 1px rgba(0, 0, 0, 0.35);
+
+ pre,
+ pre[class*='language-'] {
+ margin: 0;
+ padding: 28px 28px;
+ font-family: var(--bn-mono);
+ font-size: 13.5px;
+ line-height: 1.75;
+ color: var(--bn-cream-light);
+ background: transparent;
+ white-space: pre;
+ overflow: auto;
+ flex: 1;
+ border: 0;
+ box-shadow: none;
+ border-radius: 0;
+
+ .c-prompt { color: var(--bn-green-glow); user-select: none; }
+ .c-comment { color: rgba(245, 239, 228, 0.55); }
+ .c-cmd { color: var(--bn-yellow); }
+ .c-str { color: #9FDCC7; }
+ .c-arg { color: #FFCB69; }
+ }
+ }
+
+ .b-term-bar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 14px 18px;
+ background: #050706;
+ border-bottom: 1px solid rgba(245, 239, 228, 0.08);
+ font-family: var(--bn-mono);
+ font-size: 11px;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+ color: rgba(245, 239, 228, 0.55);
+ }
+
+ .b-term-dots {
+ display: inline-flex;
+ gap: 7px;
+
+ span {
+ width: 11px;
+ height: 11px;
+ border-radius: 50%;
+ background: rgba(245, 239, 228, 0.18);
+ }
+
+ span:nth-child(1) { background: rgba(255, 92, 57, 0.65); }
+ span:nth-child(2) { background: rgba(255, 210, 63, 0.65); }
+ span:nth-child(3) { background: rgba(45, 223, 168, 0.65); }
+ }
+
+ .b-term-title {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ }
+
+ .b-term-step { color: var(--bn-yellow); }
+
+ .b-term-cursor {
+ display: inline-block;
+ width: 8px;
+ height: 14px;
+ background: var(--bn-cream-light);
+ vertical-align: -2px;
+ animation: b-blink 1.1s steps(2, end) infinite;
+ }
+
+ @keyframes b-blink { 50% { opacity: 0; } }
+
+ //
─────────────────────────────────────────────────────────────────────────
+ // CTA
+ //
─────────────────────────────────────────────────────────────────────────
+ .b-cta {
+ background: var(--bn-green-darkest);
+ border-top: 1px solid rgba(245, 239, 228, 0.06);
+ padding: 72px 0;
+ text-align: center;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .b-cta-grid {
+ position: absolute;
+ inset: 0;
+ background-image: radial-gradient(rgba(245, 239, 228, 0.06) 1.2px,
transparent 1.2px);
+ background-size: 28px 28px;
+ mask-image: radial-gradient(ellipse at center, black 20%, transparent
70%);
+ -webkit-mask-image: radial-gradient(ellipse at center, black 20%,
transparent 70%);
+ }
+
+ .b-cta-inner { position: relative; z-index: 5; }
+
+ .b-cta-eyebrow {
+ margin-bottom: 30px;
+ justify-content: center;
+ }
+
+ .b-cta-title {
+ font-family: var(--bn-mono);
+ font-weight: 700;
+ text-transform: uppercase;
+ font-size: clamp(36px, 4.2vw, 56px);
+ line-height: 0.95;
+ letter-spacing: -0.035em;
+ word-spacing: -0.18em;
+ color: var(--bn-cream-light);
+ margin: 0 auto 44px;
+ max-width: 18ch;
+
+ .b-accent { color: var(--bn-yellow); }
+ }
+
+ .b-cta-actions {
+ display: inline-flex;
+ gap: 14px;
+ flex-wrap: wrap;
+ justify-content: center;
+ }
+
+ //
─────────────────────────────────────────────────────────────────────────
+ // Responsive
+ //
─────────────────────────────────────────────────────────────────────────
+ @media (max-width: 1100px) {
+ .b-sum-row.is-cols-3 { grid-template-columns: 1fr; }
+ .b-sum-row.is-cols-2 { grid-template-columns: 1fr; }
+ .b-card.is-active::after { display: none; }
+ .b-repro-grid { grid-template-columns: 1fr; }
+ .b-term pre { min-height: 240px; }
+ .b-bar { grid-template-columns: 104px 1fr 76px; }
+ .b-method-grid { grid-template-columns: repeat(2, 1fr); }
+ }
+
+ @media (max-width: 720px) {
+ --bn-gutter: 24px;
+
+ .b-hero,
+ .b-cmp,
+ .b-repro,
+ .b-cta { padding: 56px 0; }
+
+ .b-hero-title { font-size: clamp(32px, 8.6vw, 44px); }
+ .b-hero-sub { font-size: 14px; margin-top: 16px; }
+
+ .b-cmp-head { margin-bottom: 32px; }
+ .b-cmp-title { font-size: clamp(28px, 7.4vw, 40px); margin-bottom:
16px; }
+ .b-cmp-sub { font-size: 14px; }
+
+ .b-tabs {
+ overflow-x: auto;
+ flex-wrap: nowrap;
+ margin-bottom: 24px;
+ -webkit-overflow-scrolling: touch;
+ scrollbar-width: none;
+
+ &::-webkit-scrollbar { display: none; }
+ }
+ .b-tab {
+ padding: 14px 16px;
+ font-size: 11.5px;
+ flex: 0 0 auto;
+
+ .b-tab-tip { display: none; }
+ }
+
+ // Section 2 (Comparison): on small screens, cards are informational
only —
+ // the per-query breakdown is hidden to keep the page readable.
+ .b-card {
+ cursor: default;
+ padding: 24px 20px 22px;
+
+ &:hover {
+ transform: none;
+ border-color: rgba(15, 26, 20, 0.12);
+ box-shadow: 0 8px 22px -16px rgba(15, 26, 20, 0.18);
+ }
+
+ &.is-active {
+ background: var(--bn-paper);
+ border-color: rgba(15, 26, 20, 0.12);
+ box-shadow: none;
+
+ &::after { display: none; }
+ }
+ }
+ .b-card-head { gap: 10px; }
+ .b-card-title { font-size: 19px; }
+ .b-card-tip { display: none; }
+ .b-detail { display: none; }
+
+ .b-bar { grid-template-columns: 80px 1fr 56px; gap: 10px; font-size:
11.5px; }
+
+ .b-method { padding: 22px 18px 18px; }
+ .b-method-grid { grid-template-columns: 1fr; gap: 18px; }
+
+ .b-repro-title { font-size: clamp(28px, 7.4vw, 40px); }
+ .b-cta-title { font-size: clamp(28px, 7.4vw, 40px); margin-bottom:
32px; }
+ }
+
+ @media (max-width: 480px) {
+ .b-card { padding: 22px 16px 18px; }
+ .b-card-head {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 4px;
+ }
+ .b-card-title { font-size: 17px; }
+ .b-card-tag { padding-top: 0; }
+ .b-bars { gap: 9px; }
+ .b-bar {
+ grid-template-columns: 68px 1fr 48px;
+ gap: 8px;
+ font-size: 11px;
+ }
+ .b-bar-label { letter-spacing: 0; }
+ .b-card-desc { font-size: 12.5px; padding-top: 12px; }
+ .b-card-note { font-size: 11.5px; }
+ }
+}
diff --git a/src/components/why-doris-next/BenchmarkNext.tsx
b/src/components/why-doris-next/BenchmarkNext.tsx
new file mode 100644
index 00000000000..c42a842e1cd
--- /dev/null
+++ b/src/components/why-doris-next/BenchmarkNext.tsx
@@ -0,0 +1,815 @@
+import React, {
+ CSSProperties,
+ Fragment,
+ JSX,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from 'react';
+import Link from '@docusaurus/Link';
+import { LayoutNext } from '../home-next/LayoutNext';
+import benchmarkData from '@site/src/constant/benchmark.data.json';
+import './BenchmarkNext.scss';
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Types
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+type ProductId = 'doris' | 'clickhouse' | 'redshift' | 'snowflake' | 'trino';
+
+interface Product {
+ id: ProductId;
+ name: string;
+ version: string;
+ machine: string;
+ clusterSize: number;
+ totalRuntime: number;
+ queriesCompleted: number;
+ queriesTotal: number;
+ perQuery: Record<string, number | null>;
+}
+
+interface Benchmark {
+ id: string;
+ name: string;
+ scale: string;
+ queries: string[];
+ products: Product[];
+}
+
+interface Tab {
+ id: string;
+ label: string;
+ benchmarks: Benchmark[];
+}
+
+interface BenchmarkDataset {
+ syncedAt: string;
+ tabs: Tab[];
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Data — loaded from src/constant/benchmark.data.json
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+const DATA = benchmarkData as unknown as BenchmarkDataset;
+
+const TAB_DESCRIPTIONS: Record<string, string> = {
+ internal:
+ 'Each engine reads and writes data in its own native format, so Doris
and its peers run on their own storage layers.',
+ iceberg:
+ 'Every engine queries the same Apache Iceberg dataset, so storage is
held constant and only the engine changes.',
+};
+
+const BENCH_DESC: Record<string, string> = {
+ ssb: 'A star-schema benchmark with 13 queries, heavy on wide joins and
aggregations.',
+ tpch: 'The classic decision-support benchmark: 22 ad-hoc queries against
a normalized schema.',
+ tpcds: 'The most demanding decision-support benchmark: 99 queries that
exercise the full surface of an analytical engine.',
+};
+
+const PRODUCT_COLORS: Record<ProductId, string> = {
+ doris: 'var(--bn-green-deep)',
+ clickhouse: '#3D4A55',
+ redshift: '#A4633A',
+ snowflake: '#3C6CAA',
+ trino: 'var(--bn-coral)',
+};
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Reveal-on-scroll
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+function useRevealObserver(): void {
+ useEffect(() => {
+ const items = document.querySelectorAll<HTMLElement>('.bench-next
[data-reveal]');
+ if (!('IntersectionObserver' in window)) {
+ items.forEach(i => i.classList.add('is-visible'));
+ return undefined;
+ }
+ const io = new IntersectionObserver(
+ entries => {
+ entries.forEach(e => {
+ if (e.isIntersecting) {
+ e.target.classList.add('is-visible');
+ io.unobserve(e.target);
+ }
+ });
+ },
+ { threshold: 0.12, rootMargin: '0px 0px -8% 0px' }
+ );
+ items.forEach(i => io.observe(i));
+ return () => io.disconnect();
+ }, []);
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Hero
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+function Hero(): JSX.Element {
+ return (
+ <section className="b-hero">
+ <div className="b-container b-hero-inner">
+ <h1 className="b-hero-title" data-reveal>
+ See how fast<br />
+ <span className="b-accent">Apache Doris</span> really is.
+ </h1>
+ <p className="b-hero-sub" data-reveal data-reveal-delay="1">
+ Side-by-side query results: Doris versus ClickHouse,
Redshift, Snowflake, and
+ Trino on{' '}
+ <a
+ className="b-hero-link"
+ href="https://www.cs.umb.edu/~poneil/StarSchemaB.PDF"
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ Star Schema Benchmark
+ </a>
+ ,{' '}
+ <a
+ className="b-hero-link"
+ href="https://www.tpc.org/tpch/"
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ TPC-H
+ </a>
+ , and{' '}
+ <a
+ className="b-hero-link"
+ href="https://www.tpc.org/tpcds/"
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ TPC-DS
+ </a>
+ .
+ </p>
+ </div>
+ </section>
+ );
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Summary card row — total-runtime bars per benchmark
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+function SummaryBar({ product, max }: { product: Product; max: number }):
JSX.Element {
+ const [w, setW] = useState(0);
+ const ref = useRef<HTMLDivElement | null>(null);
+ const partial = product.queriesCompleted < product.queriesTotal;
+ const targetW = max > 0 ? (product.totalRuntime / max) * 100 : 0;
+
+ useEffect(() => {
+ if (!ref.current) return undefined;
+ const el = ref.current;
+ if (!('IntersectionObserver' in window)) {
+ setW(targetW);
+ return undefined;
+ }
+ const io = new IntersectionObserver(
+ entries => {
+ entries.forEach(e => {
+ if (e.isIntersecting) {
+ requestAnimationFrame(() => setW(targetW));
+ io.disconnect();
+ }
+ });
+ },
+ { threshold: 0.25 }
+ );
+ io.observe(el);
+ return () => io.disconnect();
+ }, [targetW]);
+
+ return (
+ <div ref={ref} className={`b-bar ${product.id === 'doris' ? 'is-doris'
: ''}`}>
+ <div className="b-bar-label">
+ <span title={product.name}>{product.name}</span>
+ {partial ? (
+ <span
+ className="b-bar-partial"
+ title={`completed ${product.queriesCompleted} of
${product.queriesTotal} queries`}
+ >
+ [1]
+ </span>
+ ) : null}
+ </div>
+ <div className="b-bar-track">
+ <div className="b-bar-fill" style={{ width: `${w}%` }} />
+ </div>
+ <div className="b-bar-value tabular">
+ {product.totalRuntime != null ?
`${product.totalRuntime.toFixed(1)}s` : '—'}
+ </div>
+ </div>
+ );
+}
+
+function SummaryCard({
+ bench,
+ active,
+ onToggle,
+}: {
+ bench: Benchmark;
+ active: boolean;
+ onToggle: () => void;
+}): JSX.Element {
+ const cardRef = useRef<HTMLButtonElement | null>(null);
+ const [revealed, setRevealed] = useState(false);
+ const sortedProducts = useMemo(
+ () =>
+ [...bench.products].sort((a, b) => {
+ const ar = a.totalRuntime ?? Infinity;
+ const br = b.totalRuntime ?? Infinity;
+ return ar - br;
+ }),
+ [bench]
+ );
+ const max = useMemo(
+ () => Math.max(...sortedProducts.map(p => p.totalRuntime || 0)),
+ [sortedProducts]
+ );
+ const hasPartial = sortedProducts.some(
+ p => p.queriesCompleted < p.queriesTotal
+ );
+
+ useEffect(() => {
+ if (!cardRef.current) return undefined;
+ if (!('IntersectionObserver' in window)) {
+ setRevealed(true);
+ return undefined;
+ }
+ const node = cardRef.current;
+ const io = new IntersectionObserver(
+ entries => {
+ entries.forEach(e => {
+ if (e.isIntersecting) {
+ setRevealed(true);
+ io.unobserve(node);
+ }
+ });
+ },
+ { threshold: 0.12, rootMargin: '0px 0px -8% 0px' }
+ );
+ io.observe(node);
+ return () => io.disconnect();
+ }, []);
+
+ const handleEnter = () => {
+ const card = cardRef.current;
+ if (!card) return;
+ const fills = card.querySelectorAll<HTMLElement>('.b-bar-fill');
+ const widths = Array.from(fills).map(f => f.style.width);
+ fills.forEach(f => {
+ f.style.transition = 'none';
+ f.style.width = '0%';
+ });
+ void card.offsetWidth;
+ fills.forEach((f, i) => {
+ f.style.transition = '';
+ requestAnimationFrame(() => {
+ f.style.width = widths[i];
+ });
+ });
+ };
+
+ return (
+ <button
+ ref={cardRef}
+ type="button"
+ className={`b-card ${active ? 'is-active' : ''} ${revealed ?
'is-visible' : ''}`}
+ onClick={onToggle}
+ onMouseEnter={handleEnter}
+ data-reveal-local
+ >
+ <div className="b-card-head">
+ <h3 className="b-card-title">{bench.name}</h3>
+ <span className="b-card-tag">{bench.scale}</span>
+ </div>
+ <div className="b-card-metric">Total Run Time</div>
+ <div className="b-bars">
+ {sortedProducts.map(p => (
+ <SummaryBar key={p.id} product={p} max={max} />
+ ))}
+ </div>
+ {hasPartial ? (
+ <div className="b-card-note">
+ [1] ClickHouse couldn’t finish some queries without
rewriting the SQL.
+ The number above counts only the queries that did finish.
+ </div>
+ ) : null}
+ <div className="b-card-desc">{BENCH_DESC[bench.id] || ''}</div>
+ <div className="b-card-tip">
+ {active ? <>Hide per-query breakdown ↑</> : <>See per-query
breakdown ↓</>}
+ </div>
+ </button>
+ );
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Detail strip — per-query grouped bars
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+function niceAxis(maxValue: number): { niceMax: number; ticks: number[] } {
+ if (maxValue <= 0) return { niceMax: 1, ticks: [1, 0] };
+ const roughStep = maxValue / 4;
+ const magnitude = Math.pow(10, Math.floor(Math.log10(roughStep)));
+ const normalized = roughStep / magnitude;
+ let nice: number;
+ if (normalized <= 1) nice = 1;
+ else if (normalized <= 2) nice = 2;
+ else if (normalized <= 5) nice = 5;
+ else nice = 10;
+ const step = nice * magnitude;
+ const niceMax = Math.ceil(maxValue / step) * step;
+ const ticks: number[] = [];
+ for (let v = niceMax; v >= -1e-9; v -= step) ticks.push(Math.round(v *
1000) / 1000);
+ return { niceMax, ticks };
+}
+
+function DetailStrip({ bench }: { bench: Benchmark }): JSX.Element {
+ const sortedProducts = useMemo(
+ () =>
+ [...bench.products].sort((a, b) => {
+ const ar = a.totalRuntime ?? Infinity;
+ const br = b.totalRuntime ?? Infinity;
+ return ar - br;
+ }),
+ [bench]
+ );
+
+ const dataMax = useMemo(() => {
+ let m = 0;
+ sortedProducts.forEach(p => {
+ bench.queries.forEach(q => {
+ const v = p.perQuery[q];
+ if (v != null && v > m) m = v;
+ });
+ });
+ return m;
+ }, [sortedProducts, bench.queries]);
+
+ const { niceMax, ticks: yticks } = useMemo(() => niceAxis(dataMax),
[dataMax]);
+
+ const [animated, setAnimated] = useState(false);
+ useEffect(() => {
+ setAnimated(false);
+ const t = setTimeout(() => setAnimated(true), 30);
+ return () => clearTimeout(t);
+ }, [bench.id]);
+
+ const barW = 10;
+ const barGap = 2;
+ const clusterPad = 8;
+ const clusterW =
+ sortedProducts.length * barW + (sortedProducts.length - 1) * barGap +
clusterPad * 2;
+
+ return (
+ <div className="b-detail">
+ <div className="b-detail-head">
+ <h3 className="b-detail-title">
+ {bench.name} per-query runtime
+ <span className="b-detail-title-sub">
+ scale {bench.scale} · {bench.queries.length} queries
+ </span>
+ </h3>
+ <div className="b-detail-legend">
+ {sortedProducts.map(p => (
+ <span key={p.id} className="b-detail-legend-item">
+ <span
+ className="b-detail-legend-swatch"
+ style={{ background: PRODUCT_COLORS[p.id] ||
'rgba(245,239,228,0.4)' }}
+ />
+ {p.name}
+ </span>
+ ))}
+ <span className="b-detail-legend-item" style={{ color:
'rgba(255,92,57,0.85)' }}>
+ <span
+ className="b-detail-legend-swatch"
+ style={{ background: 'transparent', border: '1px
dashed rgba(255,92,57,0.7)' }}
+ />
+ Failed
+ </span>
+ </div>
+ </div>
+ <div className="b-detail-scroll">
+ <div
+ className="b-chart"
+ style={{ minWidth: 60 + bench.queries.length * clusterW +
24 }}
+ >
+ <div className="b-chart-yaxis" aria-hidden="true">
+ {yticks.map((t, i) => (
+ <span key={i}>{t}s</span>
+ ))}
+ </div>
+ <div className="b-chart-grid" aria-hidden="true" />
+ <div className="b-chart-body">
+ {bench.queries.map((q, qi) => (
+ <div key={q} className="b-cluster" style={{ width:
clusterW }}>
+ <div className="b-cluster-bars" style={{ gap:
barGap }}>
+ {sortedProducts.map((p, pi) => {
+ const v = p.perQuery[q];
+ const failed = v == null;
+ const h = failed ? 18 : Math.max(2,
((v as number) / niceMax) * 230);
+ const color = PRODUCT_COLORS[p.id] ||
'rgba(245,239,228,0.4)';
+ const style: CSSProperties = {
+ width: barW,
+ height: animated ? (failed ? 18 :
h) : 0,
+ background: failed ? undefined :
color,
+ transitionDelay: `${Math.min(qi *
12 + pi * 30, 1100)}ms`,
+ };
+ return (
+ <span
+ key={p.id}
+ className={`b-cluster-bar
${p.id === 'doris' ? 'is-doris' : ''} ${
+ failed ? 'is-failed' : ''
+ }`}
+ style={style}
+ >
+ <span
className="b-cluster-bar-tip">
+ {p.name} · {q} · {failed ?
'failed' : `${(v as number).toFixed(2)}s`}
+ </span>
+ </span>
+ );
+ })}
+ </div>
+ <div
className="b-cluster-label">{q.replace(/^query0?/, 'q')}</div>
+ </div>
+ ))}
+ </div>
+ </div>
+ </div>
+ <div className="b-detail-env">
+ <ul className="b-detail-env-list">
+ {sortedProducts.map(p => {
+ const partial = p.queriesCompleted < p.queriesTotal;
+ return (
+ <li
+ key={p.id}
+ className={`b-detail-env-prod ${p.id ===
'doris' ? 'is-doris' : ''}`}
+ >
+ <span className="b-detail-env-prod-name">
+ {p.name} {p.version}
+ </span>
+ <span>
+ {' · '}
+ {p.clusterSize} × {p.machine}
+ </span>
+ {partial ? (
+ <span className="b-detail-env-partial">
+ {' · '}completed {p.queriesCompleted}
/ {p.queriesTotal}
+ </span>
+ ) : null}
+ </li>
+ );
+ })}
+ </ul>
+ </div>
+ <div className="b-detail-foot">
+ Hover any bar for its exact runtime. Hatched bars are queries
that didn’t
+ finish within the time limit.
+ </div>
+ </div>
+ );
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Comparison section
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+function Comparison(): JSX.Element {
+ const [activeTab, setActiveTab] = useState<string>(DATA.tabs[0].id);
+ const [expanded, setExpanded] = useState<string | null>(null);
+
+ const tab = DATA.tabs.find(t => t.id === activeTab) ?? DATA.tabs[0];
+ const expandedBench = tab.benchmarks.find(b => b.id === expanded);
+ const colsClass = `is-cols-${tab.benchmarks.length}`;
+
+ const switchTab = (id: string) => {
+ setActiveTab(id);
+ setExpanded(null);
+ };
+
+ return (
+ <section className="b-cmp">
+ <div className="b-cmp-bggrid" aria-hidden="true" />
+ <div className="b-container">
+ <div className="b-cmp-head" data-reveal>
+ <h2 className="b-cmp-title">Direct head-to-head, query by
query.</h2>
+ <p className="b-cmp-sub">
+ All three benchmarks lean hard on joins and complex
analytical SQL.
+ That’s the work Doris is built for. Click any
benchmark to expand
+ the per-query breakdown.
+ </p>
+ </div>
+
+ <div className="b-tabs" role="tablist" data-reveal>
+ {DATA.tabs.map(t => (
+ <button
+ key={t.id}
+ role="tab"
+ type="button"
+ aria-selected={t.id === activeTab}
+ className={`b-tab ${t.id === activeTab ?
'is-active' : ''}`}
+ onClick={() => switchTab(t.id)}
+ >
+ {t.label}
+ {TAB_DESCRIPTIONS[t.id] ? (
+ <span className="b-tab-tip" role="tooltip">
+ {TAB_DESCRIPTIONS[t.id]}
+ </span>
+ ) : null}
+ </button>
+ ))}
+ </div>
+
+ <div className={`b-sum-row ${colsClass}`}>
+ {tab.benchmarks.map(b => (
+ <SummaryCard
+ key={b.id}
+ bench={b}
+ active={expanded === b.id}
+ onToggle={() => setExpanded(expanded === b.id ?
null : b.id)}
+ />
+ ))}
+ </div>
+
+ {expandedBench ? (
+ <DetailStrip bench={expandedBench} />
+ ) : null}
+ </div>
+ </section>
+ );
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Reproduce section
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+interface StepLine {
+ p?: string;
+ cmd?: string;
+ arg?: string;
+ c?: string;
+}
+
+interface ReproStep {
+ id: number;
+ title: string;
+ body: string;
+ promptLine: string;
+ file: string;
+ lines: StepLine[];
+}
+
+const METHODOLOGY: { label: string; body: string }[] = [
+ {
+ label: 'What we measure',
+ body: 'Per-query runtime, summed across the selected queries for each
benchmark.',
+ },
+ {
+ label: 'Runs per query',
+ body: 'Each query runs at least 3×. Cold = first run; hot = faster of
runs 2 and 3.',
+ },
+ {
+ label: 'Cache control',
+ body: 'Result caches disabled on every engine. Doris BE caches cleared
before cold runs.',
+ },
+ {
+ label: 'Hardware parity',
+ body: 'Same region and VPC across engines, with identical machine
class for each cluster.',
+ },
+ {
+ label: 'Data parity',
+ body: 'Same source data loaded into each engine before the run, in its
native format.',
+ },
+ {
+ label: 'Transparency',
+ body: 'All scripts, queries, configs, and per-run metadata are
published in the repo.',
+ },
+];
+
+const REPRO_STEPS: ReproStep[] = [
+ {
+ id: 1,
+ title: 'Clone the benchmark scripts',
+ body: 'Pull the benchmark repository onto the machine that will drive
the run.',
+ promptLine: 'user@bench ~ %',
+ file: 'shell',
+ lines: [
+ { p: '$ ', cmd: 'git clone', arg:
'https://github.com/velodb/benchmarks' },
+ { c: "Cloning into 'benchmarks'…" },
+ { c: 'remote: Enumerating objects: 1,842, done.' },
+ { c: 'Receiving objects: 100% (1,842/1,842), 4.21 MiB | 8.32
MiB/s, done.' },
+ { p: '$ ', cmd: 'cd', arg: 'benchmarks' },
+ ],
+ },
+ {
+ id: 2,
+ title: 'Configure your Doris cluster endpoint',
+ body:
+ 'Open the config file and fill in the host, port, user, password,
and database for your Doris cluster.',
+ promptLine: 'user@bench ~/benchmarks %',
+ file: 'benchmark.yaml',
+ lines: [
+ { p: '$ ', cmd: 'vim', arg:
'benchmarks/clickbench/doris/benchmark.yaml' },
+ { c: '# fill in:' },
+ { c: '# host: <your-doris-fe-host>' },
+ { c: '# port: 9030' },
+ { c: '# user: root' },
+ { c: '# password: <your-password>' },
+ { c: '# database: benchmark' },
+ ],
+ },
+ {
+ id: 3,
+ title: 'Install third-party tooling',
+ body:
+ 'The runner relies on a few CLI clients (mysql, jq, hyperfine).
One make target installs them all.',
+ promptLine: 'user@bench ~/benchmarks %',
+ file: 'shell',
+ lines: [
+ { p: '$ ', cmd: 'make', arg: 'thirdparty' },
+ { c: '→ Installing mysql-client … ok' },
+ { c: '→ Installing jq … ok' },
+ { c: '→ Installing hyperfine … ok' },
+ { c: 'Third-party tooling ready.' },
+ ],
+ },
+ {
+ id: 4,
+ title: 'Run the benchmark and generate the report',
+ body:
+ 'Kick off the run, then collect the report. The runner prints a
per-query summary as it goes.',
+ promptLine: 'user@bench ~/benchmarks %',
+ file: 'shell',
+ lines: [
+ { p: '$ ', cmd: 'bash', arg: 'benchmark.sh --config
benchmarks/clickbench/doris/benchmark.yaml' },
+ { c: '[ssb] q1.1 … 0.149s q1.2 … 0.106s q1.3 … 0.099s' },
+ { c: '[ssb] q2.1 … 1.162s q2.2 … 1.237s q2.3 … 1.107s' },
+ { c: '[ssb] q3.1 … 2.223s …' },
+ { c: 'Benchmark complete · 13/13 queries · 11.559 s total' },
+ { p: '$ ', cmd: 'make', arg: 'result' },
+ { c: '→ Wrote results to results/aws.32C.json' },
+ ],
+ },
+];
+
+function ReproSection(): JSX.Element {
+ const [active, setActive] = useState(1);
+ const step = REPRO_STEPS.find(s => s.id === active) ?? REPRO_STEPS[0];
+
+ return (
+ <section className="b-repro">
+ <div className="b-container">
+ <div className="b-repro-head" data-reveal>
+ <h2 className="b-repro-title">
+ Run it yourself<br />in five minutes.
+ </h2>
+ <p className="b-repro-sub">
+ Every number above is reproducible from open scripts.
Four steps, four
+ shell commands. Click a step to see what runs.
+ </p>
+ </div>
+ <div className="b-method" data-reveal data-reveal-delay="1">
+ <div className="b-method-head">
+ <span className="b-eyebrow">
+ <span className="b-eyebrow-line" />
+ How we measure
+ </span>
+ <a
+ className="b-method-link"
+ href="https://github.com/velodb/benchmarks#readme"
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ Read the full methodology ↗
+ </a>
+ </div>
+ <div className="b-method-grid">
+ {METHODOLOGY.map(m => (
+ <div key={m.label} className="b-method-item">
+ <div className="b-method-label">{m.label}</div>
+ <div className="b-method-body">{m.body}</div>
+ </div>
+ ))}
+ </div>
+ </div>
+ <div className="b-repro-grid" data-reveal>
+ <div className="b-steps">
+ {REPRO_STEPS.map(s => (
+ <button
+ key={s.id}
+ type="button"
+ className={`b-step ${s.id === active ?
'is-active' : ''}`}
+ onClick={() => setActive(s.id)}
+ >
+ <div className="b-step-num">0{s.id}</div>
+ <div>
+ <h4 className="b-step-title">{s.title}</h4>
+ <p className="b-step-body">{s.body}</p>
+ </div>
+ </button>
+ ))}
+ </div>
+
+ <div className="b-term">
+ <div className="b-term-bar">
+ <span className="b-term-dots">
+ <span /><span /><span />
+ </span>
+ <span className="b-term-title">
+ <span>{step.promptLine}</span>
+ <span className="b-term-step">— step
0{step.id}</span>
+ </span>
+ <span>{step.file}</span>
+ </div>
+ <pre key={step.id}>
+ {step.lines.map((ln, i) => (
+ <Fragment key={i}>
+ {ln.p ? <span
className="c-prompt">{ln.p}</span> : null}
+ {ln.cmd ? <span
className="c-cmd">{ln.cmd}</span> : null}
+ {ln.arg ? (
+ <>
+ {' '}
+ <span
className="c-arg">{ln.arg}</span>
+ </>
+ ) : null}
+ {ln.c ? <span
className="c-comment">{ln.c}</span> : null}
+ {'\n'}
+ </Fragment>
+ ))}
+ <span className="c-prompt">$ </span>
+ <span className="b-term-cursor" />
+ </pre>
+ </div>
+ </div>
+ </div>
+ </section>
+ );
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * CTA
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+function CTA(): JSX.Element {
+ return (
+ <section className="b-cta">
+ <div className="b-container b-cta-inner">
+ <h2 className="b-cta-title" data-reveal data-reveal-delay="1">
+ Try Apache <span className="b-accent">Doris</span> on<br
/>your own data.
+ </h2>
+ <div className="b-cta-actions" data-reveal
data-reveal-delay="2">
+ <Link
+ className="b-btn b-btn-yellow"
+ to="/docs-next/dev/getting-started/quick-start"
+ >
+ <svg
+ width="14"
+ height="14"
+ viewBox="0 0 24 24"
+ fill="none"
+ stroke="currentColor"
+ strokeWidth="2.5"
+ aria-hidden="true"
+ >
+ <path d="M12 4v12m0 0l-5-5m5 5l5-5M4 20h16" />
+ </svg>
+ Get Started
+ </Link>
+ <button
+ type="button"
+ className="b-btn b-btn-primary"
+ disabled
+ aria-disabled="true"
+ >
+ See Report (Coming Soon)
+ </button>
+ </div>
+ </div>
+ </section>
+ );
+}
+
+/* ──────────────────────────────────────────────────────────────────────────
+ * Top-level
+ * ──────────────────────────────────────────────────────────────────────────
*/
+
+export default function BenchmarkNext(): JSX.Element {
+ useRevealObserver();
+ return (
+ <LayoutNext
+ title="Apache Doris Benchmarks: SSB, TPC-H, TPC-DS"
+ description="Direct query-performance comparisons of Apache Doris
against ClickHouse, Redshift, Snowflake, and Trino across SSB, TPC-H, and
TPC-DS at scale factor 1000."
+ >
+ <div className="bench-next">
+ <Hero />
+ <Comparison />
+ {/* <ReproSection /> hidden for now; revisit later */}
+ <CTA />
+ </div>
+ </LayoutNext>
+ );
+}
diff --git a/src/constant/benchmark.data.json b/src/constant/benchmark.data.json
new file mode 100644
index 00000000000..009529365da
--- /dev/null
+++ b/src/constant/benchmark.data.json
@@ -0,0 +1,1308 @@
+{
+ "syncedAt": "2026-05-14T06:41:06.361Z",
+ "tabs": [
+ {
+ "id": "internal",
+ "label": "Internal Table Format",
+ "benchmarks": [
+ {
+ "id": "ssb",
+ "name": "SSB",
+ "scale": "sf1000",
+ "queries": [
+ "q1.1",
+ "q1.2",
+ "q1.3",
+ "q2.1",
+ "q2.2",
+ "q2.3",
+ "q3.1",
+ "q3.2",
+ "q3.3",
+ "q3.4",
+ "q4.1",
+ "q4.2",
+ "q4.3"
+ ],
+ "products": [
+ {
+ "id": "doris",
+ "name": "Apache Doris",
+ "version": "4.1.0",
+ "machine": "32C(AWS.m8i.8xlarge)",
+ "clusterSize": 3,
+ "sourcePath": "benchmarks/ssb/sf1000/doris/results/aws.32C.json",
+ "totalRuntime": 11.559,
+ "queriesCompleted": 13,
+ "queriesTotal": 13,
+ "perQuery": {
+ "q1.1": 0.149,
+ "q1.2": 0.106,
+ "q1.3": 0.099,
+ "q2.1": 1.162,
+ "q2.2": 1.237,
+ "q2.3": 1.107,
+ "q3.1": 2.223,
+ "q3.2": 1.418,
+ "q3.3": 0.379,
+ "q3.4": 0.099,
+ "q4.1": 2.534,
+ "q4.2": 0.629,
+ "q4.3": 0.417
+ }
+ },
+ {
+ "id": "clickhouse",
+ "name": "ClickHouse",
+ "version": "25.8.1.8702",
+ "machine": "32C(aws)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/ssb/sf1000/clickhouse/results/aws.32C.json",
+ "totalRuntime": 82.22,
+ "queriesCompleted": 9,
+ "queriesTotal": 13,
+ "perQuery": {
+ "q1.1": 3.873,
+ "q1.2": 3.057,
+ "q1.3": 3.247,
+ "q2.1": 11.955,
+ "q2.2": 8.417,
+ "q2.3": 7.331,
+ "q3.1": null,
+ "q3.2": null,
+ "q3.3": null,
+ "q3.4": null,
+ "q4.1": 24.052,
+ "q4.2": 10.52,
+ "q4.3": 9.768
+ }
+ },
+ {
+ "id": "redshift",
+ "name": "Redshift",
+ "version": "1.0.163480",
+ "machine": "16XLarge(aws)",
+ "clusterSize": 2,
+ "sourcePath":
"benchmarks/ssb/sf1000/redshift/results/aws.16XLarge.json",
+ "totalRuntime": 30.06,
+ "queriesCompleted": 13,
+ "queriesTotal": 13,
+ "perQuery": {
+ "q1.1": 0.325,
+ "q1.2": 0.183,
+ "q1.3": 0.168,
+ "q2.1": 1.863,
+ "q2.2": 1.739,
+ "q2.3": 1.632,
+ "q3.1": 6.006,
+ "q3.2": 3.497,
+ "q3.3": 2.344,
+ "q3.4": 1.334,
+ "q4.1": 6.323,
+ "q4.2": 2.631,
+ "q4.3": 2.015
+ }
+ },
+ {
+ "id": "snowflake",
+ "name": "Snowflake",
+ "version": "9.38.4",
+ "machine": "XLarge(aws)",
+ "clusterSize": 1,
+ "sourcePath":
"benchmarks/ssb/sf1000/snowflake/results/aws.XLarge.json",
+ "totalRuntime": 32.91,
+ "queriesCompleted": 13,
+ "queriesTotal": 13,
+ "perQuery": {
+ "q1.1": 1.708,
+ "q1.2": 1.327,
+ "q1.3": 1.368,
+ "q2.1": 3.214,
+ "q2.2": 2.884,
+ "q2.3": 2.916,
+ "q3.1": 3.15,
+ "q3.2": 2.57,
+ "q3.3": 2.462,
+ "q3.4": 1.653,
+ "q4.1": 3.789,
+ "q4.2": 2.951,
+ "q4.3": 2.918
+ }
+ }
+ ]
+ },
+ {
+ "id": "tpch",
+ "name": "TPC-H",
+ "scale": "sf1000",
+ "queries": [
+ "q1",
+ "q2",
+ "q3",
+ "q4",
+ "q5",
+ "q6",
+ "q7",
+ "q8",
+ "q9",
+ "q10",
+ "q11",
+ "q12",
+ "q13",
+ "q14",
+ "q15",
+ "q16",
+ "q17",
+ "q18",
+ "q19",
+ "q20",
+ "q21",
+ "q22"
+ ],
+ "products": [
+ {
+ "id": "doris",
+ "name": "Apache Doris",
+ "version": "4.1.0",
+ "machine": "32C(AWS.m8i.8xlarge)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/tpch/sf1000/doris/results/aws.32C.json",
+ "totalRuntime": 53.766,
+ "queriesCompleted": 22,
+ "queriesTotal": 22,
+ "perQuery": {
+ "q1": 7.744,
+ "q2": 0.275,
+ "q3": 2.861,
+ "q4": 0.495,
+ "q5": 3.43,
+ "q6": 0.162,
+ "q7": 1.471,
+ "q8": 2.517,
+ "q9": 9.155,
+ "q10": 1.827,
+ "q11": 0.504,
+ "q12": 0.501,
+ "q13": 4.899,
+ "q14": 0.409,
+ "q15": 0.668,
+ "q16": 1.009,
+ "q17": 1.473,
+ "q18": 7.511,
+ "q19": 1.688,
+ "q20": 0.735,
+ "q21": 3.583,
+ "q22": 0.849
+ }
+ },
+ {
+ "id": "clickhouse",
+ "name": "ClickHouse",
+ "version": "25.8.1.8702",
+ "machine": "32C(aws)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/tpch/sf1000/clickhouse/results/aws.32C.json",
+ "totalRuntime": 278.978,
+ "queriesCompleted": 13,
+ "queriesTotal": 22,
+ "perQuery": {
+ "q1": 35.98,
+ "q2": 11.053,
+ "q3": null,
+ "q4": 16.35,
+ "q5": null,
+ "q6": 12.058,
+ "q7": null,
+ "q8": null,
+ "q9": null,
+ "q10": null,
+ "q11": 5.619,
+ "q12": 14.954,
+ "q13": null,
+ "q14": 10.555,
+ "q15": null,
+ "q16": 3.171,
+ "q17": 77.529,
+ "q18": 50.024,
+ "q19": 27.343,
+ "q20": 9.16,
+ "q21": null,
+ "q22": 5.182
+ }
+ },
+ {
+ "id": "redshift",
+ "name": "Redshift",
+ "version": "1.0.163480",
+ "machine": "16XLarge(aws)",
+ "clusterSize": 2,
+ "sourcePath":
"benchmarks/tpch/sf1000/redshift/results/aws.16XLarge.json",
+ "totalRuntime": 120.639,
+ "queriesCompleted": 22,
+ "queriesTotal": 22,
+ "perQuery": {
+ "q1": 9.471,
+ "q2": 2.06,
+ "q3": 5.5,
+ "q4": 4.3,
+ "q5": 3.689,
+ "q6": 0.324,
+ "q7": 3.8,
+ "q8": 3.175,
+ "q9": 12.441,
+ "q10": 5.55,
+ "q11": 0.908,
+ "q12": 1.526,
+ "q13": 13.056,
+ "q14": 1.704,
+ "q15": 3.017,
+ "q16": 2.686,
+ "q17": 3.112,
+ "q18": 15.102,
+ "q19": 4.742,
+ "q20": 3.943,
+ "q21": 16.363,
+ "q22": 4.17
+ }
+ },
+ {
+ "id": "snowflake",
+ "name": "Snowflake",
+ "version": "9.38.4",
+ "machine": "XLarge(aws)",
+ "clusterSize": 1,
+ "sourcePath":
"benchmarks/tpch/sf1000/snowflake/results/aws.XLarge.json",
+ "totalRuntime": 102.493,
+ "queriesCompleted": 22,
+ "queriesTotal": 22,
+ "perQuery": {
+ "q1": 5.942,
+ "q2": 2.707,
+ "q3": 4.62,
+ "q4": 3.102,
+ "q5": 5.254,
+ "q6": 1.647,
+ "q7": 3.964,
+ "q8": 3.813,
+ "q9": 7.851,
+ "q10": 5.814,
+ "q11": 2.178,
+ "q12": 3.227,
+ "q13": 7.331,
+ "q14": 1.781,
+ "q15": 2.312,
+ "q16": 4.411,
+ "q17": 3.375,
+ "q18": 13.083,
+ "q19": 3.081,
+ "q20": 6.862,
+ "q21": 8.02,
+ "q22": 2.118
+ }
+ }
+ ]
+ },
+ {
+ "id": "tpcds",
+ "name": "TPC-DS",
+ "scale": "sf1000",
+ "queries": [
+ "query01",
+ "query02",
+ "query03",
+ "query04",
+ "query05",
+ "query06",
+ "query07",
+ "query08",
+ "query09",
+ "query10",
+ "query11",
+ "query12",
+ "query13",
+ "query14",
+ "query14_1",
+ "query15",
+ "query16",
+ "query17",
+ "query18",
+ "query19",
+ "query20",
+ "query21",
+ "query22",
+ "query23",
+ "query23_1",
+ "query24",
+ "query24_1",
+ "query25",
+ "query26",
+ "query27",
+ "query28",
+ "query29",
+ "query30",
+ "query31",
+ "query32",
+ "query33",
+ "query34",
+ "query35",
+ "query36",
+ "query37",
+ "query38",
+ "query39",
+ "query39_1",
+ "query40",
+ "query41",
+ "query42",
+ "query43",
+ "query44",
+ "query45",
+ "query46",
+ "query47",
+ "query48",
+ "query49",
+ "query50",
+ "query51",
+ "query52",
+ "query53",
+ "query54",
+ "query55",
+ "query56",
+ "query57",
+ "query58",
+ "query59",
+ "query60",
+ "query61",
+ "query62",
+ "query63",
+ "query64",
+ "query65",
+ "query66",
+ "query67",
+ "query68",
+ "query69",
+ "query70",
+ "query71",
+ "query72",
+ "query73",
+ "query74",
+ "query75",
+ "query76",
+ "query77",
+ "query78",
+ "query79",
+ "query80",
+ "query81",
+ "query82",
+ "query83",
+ "query84",
+ "query85",
+ "query86",
+ "query87",
+ "query88",
+ "query89",
+ "query90",
+ "query91",
+ "query92",
+ "query93",
+ "query94",
+ "query95",
+ "query96",
+ "query97",
+ "query98",
+ "query99"
+ ],
+ "products": [
+ {
+ "id": "doris",
+ "name": "Apache Doris",
+ "version": "4.1.0",
+ "machine": "32C(AWS.m8i.8xlarge)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/tpcds/sf1000/doris/results/aws.32C.json",
+ "totalRuntime": 173.84,
+ "queriesCompleted": 103,
+ "queriesTotal": 103,
+ "perQuery": {
+ "query01": 0.54,
+ "query02": 0.658,
+ "query03": 0.171,
+ "query04": 7.144,
+ "query05": 0.747,
+ "query06": 0.492,
+ "query07": 0.339,
+ "query08": 0.41,
+ "query09": 4.098,
+ "query10": 0.318,
+ "query11": 4.762,
+ "query12": 0.157,
+ "query13": 0.448,
+ "query14": 6.239,
+ "query14_1": 5.773,
+ "query15": 0.285,
+ "query16": 0.245,
+ "query17": 1.619,
+ "query18": 0.734,
+ "query19": 0.29,
+ "query20": 0.162,
+ "query21": 0.121,
+ "query22": 0.784,
+ "query23": 11.874,
+ "query23_1": 11.952,
+ "query24": 3.469,
+ "query24_1": 3.462,
+ "query25": 0.965,
+ "query26": 0.176,
+ "query27": 0.339,
+ "query28": 3.488,
+ "query29": 0.831,
+ "query30": 0.247,
+ "query31": 1.555,
+ "query32": 0.115,
+ "query33": 0.358,
+ "query34": 0.315,
+ "query35": 0.925,
+ "query36": 0.338,
+ "query37": 0.1,
+ "query38": 6.081,
+ "query39": 0.263,
+ "query39_1": 0.217,
+ "query40": 0.148,
+ "query41": 0.115,
+ "query42": 0.107,
+ "query43": 0.348,
+ "query44": 1.026,
+ "query45": 0.284,
+ "query46": 0.482,
+ "query47": 2.19,
+ "query48": 0.304,
+ "query49": 0.666,
+ "query50": 0.367,
+ "query51": 3.737,
+ "query52": 0.104,
+ "query53": 0.255,
+ "query54": 0.315,
+ "query55": 0.138,
+ "query56": 0.376,
+ "query57": 1.301,
+ "query58": 0.356,
+ "query59": 1.7,
+ "query60": 0.368,
+ "query61": 0.298,
+ "query62": 0.471,
+ "query63": 0.237,
+ "query64": 2.8,
+ "query65": 3.188,
+ "query66": 0.393,
+ "query67": 21.909,
+ "query68": 0.278,
+ "query69": 0.956,
+ "query70": 2.202,
+ "query71": 0.983,
+ "query72": 2.41,
+ "query73": 0.15,
+ "query74": 3.935,
+ "query75": 3.168,
+ "query76": 0.953,
+ "query77": 0.287,
+ "query78": 9.614,
+ "query79": 1.646,
+ "query80": 0.64,
+ "query81": 0.374,
+ "query82": 0.236,
+ "query83": 0.31,
+ "query84": 0.183,
+ "query85": 0.812,
+ "query86": 0.697,
+ "query87": 6.302,
+ "query88": 3.261,
+ "query89": 0.425,
+ "query90": 0.132,
+ "query91": 0.206,
+ "query92": 0.07,
+ "query93": 1.049,
+ "query94": 0.188,
+ "query95": 0.246,
+ "query96": 0.353,
+ "query97": 2.791,
+ "query98": 0.542,
+ "query99": 0.852
+ }
+ },
+ {
+ "id": "clickhouse",
+ "name": "ClickHouse",
+ "version": "25.8.1.8909",
+ "machine": "32C(aws)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/tpcds/sf1000/clickhouse/results/aws.32C.json",
+ "totalRuntime": 1913.903,
+ "queriesCompleted": 70,
+ "queriesTotal": 103,
+ "perQuery": {
+ "query01": 3.588,
+ "query02": 15.8,
+ "query03": null,
+ "query04": null,
+ "query05": 30.833,
+ "query06": null,
+ "query07": 11.171,
+ "query08": 96.482,
+ "query09": 22.78,
+ "query10": null,
+ "query11": null,
+ "query12": 2.036,
+ "query13": 50.597,
+ "query14": null,
+ "query14_1": null,
+ "query15": 37.795,
+ "query16": null,
+ "query17": null,
+ "query18": null,
+ "query19": null,
+ "query20": 3.667,
+ "query21": 2.652,
+ "query22": 2.393,
+ "query23": 115.795,
+ "query23_1": 103.462,
+ "query24": 45.273,
+ "query24_1": 34.561,
+ "query25": null,
+ "query26": 5.051,
+ "query27": 10.925,
+ "query28": 21.889,
+ "query29": null,
+ "query30": null,
+ "query31": 22.263,
+ "query32": 1.93,
+ "query33": 7.11,
+ "query34": 8.148,
+ "query35": null,
+ "query36": 7.949,
+ "query37": 2.874,
+ "query38": 219.46,
+ "query39": 5.681,
+ "query39_1": 5.581,
+ "query40": 12.631,
+ "query41": 0.148,
+ "query42": null,
+ "query43": null,
+ "query44": 7.575,
+ "query45": 21.249,
+ "query46": 12.581,
+ "query47": null,
+ "query48": 38.676,
+ "query49": null,
+ "query50": 31.223,
+ "query51": 17.045,
+ "query52": null,
+ "query53": 10.587,
+ "query54": 37.603,
+ "query55": null,
+ "query56": 7.051,
+ "query57": null,
+ "query58": null,
+ "query59": 40.066,
+ "query60": 7.403,
+ "query61": 15.461,
+ "query62": 7.831,
+ "query63": 11.724,
+ "query64": null,
+ "query65": 22.807,
+ "query66": null,
+ "query67": null,
+ "query68": 13.766,
+ "query69": null,
+ "query70": 15.993,
+ "query71": 7.327,
+ "query72": null,
+ "query73": 7.586,
+ "query74": null,
+ "query75": null,
+ "query76": 4.984,
+ "query77": 8.473,
+ "query78": 0.199,
+ "query79": 21.412,
+ "query80": 41.418,
+ "query81": null,
+ "query82": 6.274,
+ "query83": 1.741,
+ "query84": 2.523,
+ "query85": 5.967,
+ "query86": 1.487,
+ "query87": 221.924,
+ "query88": 44.311,
+ "query89": 16.301,
+ "query90": 2.589,
+ "query91": 1.166,
+ "query92": 1.47,
+ "query93": 140.244,
+ "query94": null,
+ "query95": null,
+ "query96": 5.169,
+ "query97": 120.58,
+ "query98": 7.779,
+ "query99": 13.813
+ }
+ },
+ {
+ "id": "redshift",
+ "name": "Redshift",
+ "version": "1.0.162991",
+ "machine": "16XLarge(aws)",
+ "clusterSize": 2,
+ "sourcePath":
"benchmarks/tpcds/sf1000/redshift/results/aws.16XLarge.json",
+ "totalRuntime": 395.495,
+ "queriesCompleted": 103,
+ "queriesTotal": 103,
+ "perQuery": {
+ "query01": 2.788,
+ "query02": 3.305,
+ "query03": 0.701,
+ "query04": 22.186,
+ "query05": 1.043,
+ "query06": 0.388,
+ "query07": 0.615,
+ "query08": 0.53,
+ "query09": 3.715,
+ "query10": 0.795,
+ "query11": 23.508,
+ "query12": 0.369,
+ "query13": 0.795,
+ "query14": 13.389,
+ "query14_1": 12.756,
+ "query15": 1.544,
+ "query16": 1.429,
+ "query17": 0.66,
+ "query18": 0.904,
+ "query19": 0.384,
+ "query20": 0.295,
+ "query21": 0.25,
+ "query22": 4.495,
+ "query23": 27.114,
+ "query23_1": 27.049,
+ "query24": 4.804,
+ "query24_1": 4.938,
+ "query25": 0.769,
+ "query26": 0.509,
+ "query27": 0.674,
+ "query28": 4.929,
+ "query29": 0.783,
+ "query30": 2.657,
+ "query31": 4.512,
+ "query32": 0.36,
+ "query33": 1.002,
+ "query34": 0.913,
+ "query35": 2.21,
+ "query36": 0.659,
+ "query37": 0.322,
+ "query38": 7.7,
+ "query39": 0.541,
+ "query39_1": 0.509,
+ "query40": 0.319,
+ "query41": 0.335,
+ "query42": 0.285,
+ "query43": 1.268,
+ "query44": 1.41,
+ "query45": 2.387,
+ "query46": 2.012,
+ "query47": 15.129,
+ "query48": 0.74,
+ "query49": 0.699,
+ "query50": 1.567,
+ "query51": 3.653,
+ "query52": 0.274,
+ "query53": 0.584,
+ "query54": 0.515,
+ "query55": 0.268,
+ "query56": 0.888,
+ "query57": 10.113,
+ "query58": 0.566,
+ "query59": 6.29,
+ "query60": 0.918,
+ "query61": 0.591,
+ "query62": 1.183,
+ "query63": 0.529,
+ "query64": 5.672,
+ "query65": 5.613,
+ "query66": 0.961,
+ "query67": 43.631,
+ "query68": 0.614,
+ "query69": 5.052,
+ "query70": 2.103,
+ "query71": 2.35,
+ "query72": 3.298,
+ "query73": 0.481,
+ "query74": 12.343,
+ "query75": 5.562,
+ "query76": 1.626,
+ "query77": 0.668,
+ "query78": 15.873,
+ "query79": 4.764,
+ "query80": 0.759,
+ "query81": 3.366,
+ "query82": 0.59,
+ "query83": 0.488,
+ "query84": 0.369,
+ "query85": 0.879,
+ "query86": 0.539,
+ "query87": 10.004,
+ "query88": 8.761,
+ "query89": 0.814,
+ "query90": 0.767,
+ "query91": 0.35,
+ "query92": 0.354,
+ "query93": 1.393,
+ "query94": 2.226,
+ "query95": 0.737,
+ "query96": 1.226,
+ "query97": 5.773,
+ "query98": 1.322,
+ "query99": 1.846
+ }
+ },
+ {
+ "id": "snowflake",
+ "name": "Snowflake",
+ "version": "9.37.1",
+ "machine": "XLarge(aws)",
+ "clusterSize": 1,
+ "sourcePath":
"benchmarks/tpcds/sf1000/snowflake/results/aws.XLarge.json",
+ "totalRuntime": 464.562,
+ "queriesCompleted": 103,
+ "queriesTotal": 103,
+ "perQuery": {
+ "query01": 1.834,
+ "query02": 2.889,
+ "query03": 1.716,
+ "query04": 34.019,
+ "query05": 3.802,
+ "query06": 2.381,
+ "query07": 3.226,
+ "query08": 2.071,
+ "query09": 4.531,
+ "query10": 3.554,
+ "query11": 22.791,
+ "query12": 2.215,
+ "query13": 3.13,
+ "query14": 8.642,
+ "query14_1": 7.874,
+ "query15": 2.457,
+ "query16": 2.552,
+ "query17": 5.535,
+ "query18": 4.008,
+ "query19": 2.429,
+ "query20": 1.496,
+ "query21": 2.414,
+ "query22": 3.478,
+ "query23": 14.167,
+ "query23_1": 14.618,
+ "query24": 4.597,
+ "query24_1": 4.47,
+ "query25": 3.697,
+ "query26": 1.978,
+ "query27": 2.65,
+ "query28": 5.861,
+ "query29": 4.535,
+ "query30": 1.072,
+ "query31": 3.678,
+ "query32": 1.511,
+ "query33": 2.687,
+ "query34": 4.356,
+ "query35": 4.974,
+ "query36": 2.051,
+ "query37": 1.92,
+ "query38": 7.22,
+ "query39": 5.1,
+ "query39_1": 2.67,
+ "query40": 2.595,
+ "query41": 1.328,
+ "query42": 1.341,
+ "query43": 1.738,
+ "query44": 3.306,
+ "query45": 2.768,
+ "query46": 2.849,
+ "query47": 5.182,
+ "query48": 3.155,
+ "query49": 3.219,
+ "query50": 4.591,
+ "query51": 3.97,
+ "query52": 1.354,
+ "query53": 1.888,
+ "query54": 2.279,
+ "query55": 1.651,
+ "query56": 2.342,
+ "query57": 3.152,
+ "query58": 1.984,
+ "query59": 3.137,
+ "query60": 2.882,
+ "query61": 2.795,
+ "query62": 2.316,
+ "query63": 1.846,
+ "query64": 9.575,
+ "query65": 3.718,
+ "query66": 3.758,
+ "query67": 7.539,
+ "query68": 2.462,
+ "query69": 3.01,
+ "query70": 2.448,
+ "query71": 24.39,
+ "query72": 1.082,
+ "query73": 1.58,
+ "query74": 13.536,
+ "query75": 11.545,
+ "query76": 3.003,
+ "query77": 2.719,
+ "query78": 12.884,
+ "query79": 4.291,
+ "query80": 4.495,
+ "query81": 2.319,
+ "query82": 1.902,
+ "query83": 2.721,
+ "query84": 1.783,
+ "query85": 4.48,
+ "query86": 2.262,
+ "query87": 10.484,
+ "query88": 3.412,
+ "query89": 2.954,
+ "query90": 1.84,
+ "query91": 1.72,
+ "query92": 1.546,
+ "query93": 4.116,
+ "query94": 2.625,
+ "query95": 3.152,
+ "query96": 2.722,
+ "query97": 5.426,
+ "query98": 7.484,
+ "query99": 3.055
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "iceberg",
+ "label": "Iceberg Table Format",
+ "benchmarks": [
+ {
+ "id": "ssb",
+ "name": "SSB",
+ "scale": "sf1000",
+ "queries": [
+ "q1.1",
+ "q1.2",
+ "q1.3",
+ "q2.1",
+ "q2.2",
+ "q2.3",
+ "q3.1",
+ "q3.2",
+ "q3.3",
+ "q3.4",
+ "q4.1",
+ "q4.2",
+ "q4.3"
+ ],
+ "products": [
+ {
+ "id": "doris",
+ "name": "Apache Doris",
+ "version": "4.1.0",
+ "machine": "32C(AWS.m8i.8xlarge)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/ssb/sf1000/doris_iceberg_rest_s3_parquet/results/aws.32C.json",
+ "totalRuntime": 58.591,
+ "queriesCompleted": 13,
+ "queriesTotal": 13,
+ "perQuery": {
+ "q1.1": 2.547,
+ "q1.2": 1.224,
+ "q1.3": 1.134,
+ "q2.1": 7.299,
+ "q2.2": 6.747,
+ "q2.3": 6.828,
+ "q3.1": 4.375,
+ "q3.2": 3.363,
+ "q3.3": 3.103,
+ "q3.4": 1.178,
+ "q4.1": 8.456,
+ "q4.2": 5.524,
+ "q4.3": 6.813
+ }
+ },
+ {
+ "id": "trino",
+ "name": "Trino",
+ "version": "479",
+ "machine": "32C(AWS.m8i.8xlarge)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/ssb/sf1000/trino_iceberg_rest_s3_parquet/results/aws.32C.json",
+ "totalRuntime": 159.213,
+ "queriesCompleted": 13,
+ "queriesTotal": 13,
+ "perQuery": {
+ "q1.1": 5.206,
+ "q1.2": 6.52,
+ "q1.3": 6.397,
+ "q2.1": 15.636,
+ "q2.2": 13.394,
+ "q2.3": 12.972,
+ "q3.1": 16.832,
+ "q3.2": 11.432,
+ "q3.3": 11.101,
+ "q3.4": 7.688,
+ "q4.1": 22.958,
+ "q4.2": 16.909,
+ "q4.3": 12.168
+ }
+ }
+ ]
+ },
+ {
+ "id": "tpcds",
+ "name": "TPC-DS",
+ "scale": "sf1000",
+ "queries": [
+ "query01",
+ "query02",
+ "query03",
+ "query04",
+ "query05",
+ "query06",
+ "query07",
+ "query08",
+ "query09",
+ "query10",
+ "query11",
+ "query12",
+ "query13",
+ "query14",
+ "query14_1",
+ "query15",
+ "query16",
+ "query17",
+ "query18",
+ "query19",
+ "query20",
+ "query21",
+ "query22",
+ "query23",
+ "query23_1",
+ "query24",
+ "query24_1",
+ "query25",
+ "query26",
+ "query27",
+ "query28",
+ "query29",
+ "query30",
+ "query31",
+ "query32",
+ "query33",
+ "query34",
+ "query35",
+ "query36",
+ "query37",
+ "query38",
+ "query39",
+ "query39_1",
+ "query40",
+ "query41",
+ "query42",
+ "query43",
+ "query44",
+ "query45",
+ "query46",
+ "query47",
+ "query48",
+ "query49",
+ "query50",
+ "query51",
+ "query52",
+ "query53",
+ "query54",
+ "query55",
+ "query56",
+ "query57",
+ "query58",
+ "query59",
+ "query60",
+ "query61",
+ "query62",
+ "query63",
+ "query64",
+ "query65",
+ "query66",
+ "query67",
+ "query68",
+ "query69",
+ "query70",
+ "query71",
+ "query72",
+ "query73",
+ "query74",
+ "query75",
+ "query76",
+ "query77",
+ "query78",
+ "query79",
+ "query80",
+ "query81",
+ "query82",
+ "query83",
+ "query84",
+ "query85",
+ "query86",
+ "query87",
+ "query88",
+ "query89",
+ "query90",
+ "query91",
+ "query92",
+ "query93",
+ "query94",
+ "query95",
+ "query96",
+ "query97",
+ "query98",
+ "query99"
+ ],
+ "products": [
+ {
+ "id": "doris",
+ "name": "Apache Doris",
+ "version": "4.1.0",
+ "machine": "32C(AWS.m8i.8xlarge)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/tpcds/sf1000/doris_iceberg_rest_s3_parquet/results/aws.32C.json",
+ "totalRuntime": 823.896,
+ "queriesCompleted": 103,
+ "queriesTotal": 103,
+ "perQuery": {
+ "query01": 0.755,
+ "query02": 3.859,
+ "query03": 1.087,
+ "query04": 116.99,
+ "query05": 3.725,
+ "query06": 2.412,
+ "query07": 2.814,
+ "query08": 1.157,
+ "query09": 12.154,
+ "query10": 2.699,
+ "query11": 202.115,
+ "query12": 0.362,
+ "query13": 4.68,
+ "query14": 8.634,
+ "query14_1": 9.942,
+ "query15": 2.48,
+ "query16": 1.402,
+ "query17": 6.427,
+ "query18": 3.566,
+ "query19": 1.033,
+ "query20": 0.478,
+ "query21": 0.725,
+ "query22": 2.033,
+ "query23": 19.787,
+ "query23_1": 19.604,
+ "query24": 2.812,
+ "query24_1": 2.861,
+ "query25": 5.136,
+ "query26": 2.376,
+ "query27": 4.164,
+ "query28": 13.992,
+ "query29": 7.553,
+ "query30": 0.495,
+ "query31": 1.829,
+ "query32": 0.423,
+ "query33": 2.29,
+ "query34": 2.804,
+ "query35": 1.703,
+ "query36": 1.549,
+ "query37": 0.842,
+ "query38": 9.081,
+ "query39": 1.119,
+ "query39_1": 0.823,
+ "query40": 0.982,
+ "query41": 0.164,
+ "query42": 0.733,
+ "query43": 1.811,
+ "query44": 5.479,
+ "query45": 2.071,
+ "query46": 3.683,
+ "query47": 3.178,
+ "query48": 2.696,
+ "query49": 16.43,
+ "query50": 3.719,
+ "query51": 4.716,
+ "query52": 0.813,
+ "query53": 1.295,
+ "query54": 4.406,
+ "query55": 0.683,
+ "query56": 2.617,
+ "query57": 1.798,
+ "query58": 1.446,
+ "query59": 6.729,
+ "query60": 2.149,
+ "query61": 9.615,
+ "query62": 0.869,
+ "query63": 1.198,
+ "query64": 18.081,
+ "query65": 5.818,
+ "query66": 2.358,
+ "query67": 35.839,
+ "query68": 5.25,
+ "query69": 1.786,
+ "query70": 3.733,
+ "query71": 3.429,
+ "query72": 11.946,
+ "query73": 4.262,
+ "query74": 65.353,
+ "query75": 7.533,
+ "query76": 3.2,
+ "query77": 2.894,
+ "query78": 18.062,
+ "query79": 5.616,
+ "query80": 5.059,
+ "query81": 0.595,
+ "query82": 0.998,
+ "query83": 0.929,
+ "query84": 0.366,
+ "query85": 1.623,
+ "query86": 0.838,
+ "query87": 10.594,
+ "query88": 11.401,
+ "query89": 1.507,
+ "query90": 2.43,
+ "query91": 0.396,
+ "query92": 0.352,
+ "query93": 5.031,
+ "query94": 0.888,
+ "query95": 1.312,
+ "query96": 1.562,
+ "query97": 6.361,
+ "query98": 2.682,
+ "query99": 1.76
+ }
+ },
+ {
+ "id": "trino",
+ "name": "Trino",
+ "version": "479",
+ "machine": "32C(AWS.m8i.8xlarge)",
+ "clusterSize": 3,
+ "sourcePath":
"benchmarks/tpcds/sf1000/trino_iceberg_rest_s3_parquet/results/aws.32C.json",
+ "totalRuntime": 2366.332,
+ "queriesCompleted": 103,
+ "queriesTotal": 103,
+ "perQuery": {
+ "query01": 3.807,
+ "query02": 13.557,
+ "query03": 4.154,
+ "query04": 191.955,
+ "query05": 12.684,
+ "query06": 5.177,
+ "query07": 8.308,
+ "query08": 5.013,
+ "query09": 30.093,
+ "query10": 6.64,
+ "query11": 118.555,
+ "query12": 2.868,
+ "query13": 29.608,
+ "query14": 85.887,
+ "query14_1": 57.319,
+ "query15": 4.405,
+ "query16": 19.309,
+ "query17": 12.828,
+ "query18": 8.411,
+ "query19": 5.55,
+ "query20": 3.097,
+ "query21": 4.586,
+ "query22": 8.707,
+ "query23": 241.021,
+ "query23_1": 239.289,
+ "query24": 18.576,
+ "query24_1": 18.95,
+ "query25": 9.164,
+ "query26": 6.069,
+ "query27": 7.023,
+ "query28": 19.518,
+ "query29": 17.343,
+ "query30": 3.53,
+ "query31": 14.882,
+ "query32": 4.209,
+ "query33": 8.202,
+ "query34": 8.025,
+ "query35": 7.955,
+ "query36": 6.658,
+ "query37": 6.214,
+ "query38": 32.814,
+ "query39": 9.699,
+ "query39_1": 8.378,
+ "query40": 3.667,
+ "query41": 1.325,
+ "query42": 3.521,
+ "query43": 5.386,
+ "query44": 11.819,
+ "query45": 3.806,
+ "query46": 11.821,
+ "query47": 39.339,
+ "query48": 18.842,
+ "query49": 16.682,
+ "query50": 27.159,
+ "query51": 12.547,
+ "query52": 3.632,
+ "query53": 4.624,
+ "query54": 25.551,
+ "query55": 3.836,
+ "query56": 7.886,
+ "query57": 21.524,
+ "query58": 6.499,
+ "query59": 42.93,
+ "query60": 8.449,
+ "query61": 11.051,
+ "query62": 6.503,
+ "query63": 4.74,
+ "query64": 27.559,
+ "query65": 20.174,
+ "query66": 8.096,
+ "query67": 61.155,
+ "query68": 14.52,
+ "query69": 5.642,
+ "query70": 17.216,
+ "query71": 8.43,
+ "query72": 104.087,
+ "query73": 8.033,
+ "query74": 83.114,
+ "query75": 29.998,
+ "query76": 10.296,
+ "query77": 9.473,
+ "query78": 61.117,
+ "query79": 17.879,
+ "query80": 13.131,
+ "query81": 4.222,
+ "query82": 10.519,
+ "query83": 4.245,
+ "query84": 2.974,
+ "query85": 7.624,
+ "query86": 3.932,
+ "query87": 34.138,
+ "query88": 27.75,
+ "query89": 5.227,
+ "query90": 3.804,
+ "query91": 2.835,
+ "query92": 2.818,
+ "query93": 27.401,
+ "query94": 9.962,
+ "query95": 42.328,
+ "query96": 5.024,
+ "query97": 24.588,
+ "query98": 3.569,
+ "query99": 10.276
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/pages/why-doris/benchmarks/index.tsx
b/src/pages/why-doris/benchmarks/index.tsx
new file mode 100644
index 00000000000..5907927c3bb
--- /dev/null
+++ b/src/pages/why-doris/benchmarks/index.tsx
@@ -0,0 +1,6 @@
+import React, { JSX } from 'react';
+import BenchmarkNext from '@site/src/components/why-doris-next/BenchmarkNext';
+
+export default function BenchmarksPage(): JSX.Element {
+ return <BenchmarkNext />;
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]