diff --git a/benchmarks/yard_export.cpp b/benchmarks/yard_export.cpp index 3bc97eb..d27ccbb 100644 --- a/benchmarks/yard_export.cpp +++ b/benchmarks/yard_export.cpp @@ -153,6 +153,49 @@ std::string node_detail(const std::string& line) { return line.substr(bracket + 1, line.size() - bracket - 2); } +struct OwnedSubquery { + std::string detail; + const plan::LogicalPlan* plan{nullptr}; +}; + +void collect_scalar_subquery(const plan::BoundScalarExpr& expression, + std::vector& subqueries) { + if (const auto* subquery = std::get_if(&expression.value); + subquery != nullptr && subquery->plan != nullptr) { + subqueries.push_back({"Subquery[" + subquery->name + "]", subquery->plan.get()}); + } +} + +void collect_predicate_subqueries(const plan::BoundPredicate& predicate, + std::vector& subqueries) { + if (predicate.kind == sql::PredicateKind::Comparison) { + collect_scalar_subquery(predicate.comparison.left, subqueries); + collect_scalar_subquery(predicate.comparison.right, subqueries); + } + if (predicate.subquery != nullptr) { + subqueries.push_back({"Subquery[" + predicate.subquery_name + "]", predicate.subquery.get()}); + } + if (predicate.left != nullptr) collect_predicate_subqueries(*predicate.left, subqueries); + if (predicate.right != nullptr) collect_predicate_subqueries(*predicate.right, subqueries); +} + +std::string tree_json(const plan::LogicalPlan& node, const execution::Catalog& catalog, int indent); + +std::string subquery_tree_json(const OwnedSubquery& subquery, + const execution::Catalog& catalog, + int indent) { + const auto estimate = optimizer::estimate_cost(*subquery.plan, catalog); + const std::string pad(static_cast(indent), ' '); + std::string out = "{\n" + pad + " \"op\": \"Subquery\"," + + "\n" + pad + " \"detail\": " + quoted(subquery.detail) + + ",\n" + pad + " \"rows\": " + fixed(estimate.rows, 2) + + ",\n" + pad + " \"cost\": " + fixed(estimate.cost, 2) + + ",\n" + pad + " \"children\": [\n" + pad + " " + + tree_json(*subquery.plan, catalog, indent + 4) + + "\n" + pad + " ]\n" + pad + "}"; + return out; +} + std::string tree_json(const plan::LogicalPlan& node, const execution::Catalog& catalog, int indent) { const auto estimate = optimizer::estimate_cost(node, catalog); const auto line = node_line(node); @@ -166,10 +209,23 @@ std::string tree_json(const plan::LogicalPlan& node, const execution::Catalog& c if (node.input) children.push_back(node.input.get()); if (node.left) children.push_back(node.left.get()); if (node.right) children.push_back(node.right.get()); - for (std::size_t i = 0; i < children.size(); ++i) { - out += (i == 0 ? "\n" : ",\n") + pad + " " + tree_json(*children[i], catalog, indent + 4); + std::vector subqueries; + for (const auto& predicate : node.predicates) { + collect_predicate_subqueries(predicate, subqueries); + } + if (node.null_aware_predicate.has_value()) { + collect_predicate_subqueries(*node.null_aware_predicate, subqueries); + } + std::size_t child_index = 0; + for (const auto* child : children) { + out += (child_index++ == 0 ? "\n" : ",\n") + pad + " " + + tree_json(*child, catalog, indent + 4); + } + for (const auto& subquery : subqueries) { + out += (child_index++ == 0 ? "\n" : ",\n") + pad + " " + + subquery_tree_json(subquery, catalog, indent + 4); } - out += children.empty() ? "]" : "\n" + pad + " ]"; + out += child_index == 0 ? "]" : "\n" + pad + " ]"; out += "\n" + pad + "}"; return out; } diff --git a/docs/benchmarks.md b/docs/benchmarks.md index d62c83b..f263bc0 100644 --- a/docs/benchmarks.md +++ b/docs/benchmarks.md @@ -281,9 +281,9 @@ and correlated candidate-set semantics. The vectorized grouped hash kernel is 16.350x faster on median than the interpreted left-row-major semantic oracle for this selective workload. -## Yard Routes (2026-09-01) +## Yard Routes (2026-09-02, re-exported with predicate-owned subquery plans in the tree) -`yard_export` (commit `1058974ea747`) enumerates every memo alternative for four +`yard_export` (commit `7de892a65834`) enumerates every memo alternative for four workings, prices each with `estimate_cost`, and times each through vectorized execution with the same Release build, five-repetition min/median, deterministic data, and checksum-before-timing methodology as above. The chosen row is the @@ -300,10 +300,10 @@ memo: 4 groups, 1 iterations, fired rules: JoinCommuteRule | alternative | plan | total cost | vectorized min ms | vectorized median ms | |---:|---|---:|---:|---:| -| 0 (chosen) | `Project[left_payload=col(l.payload), right_payload=col(r.payload)] Join[col(l.k1) = col(r.k1) AND col(l.k2) = col(r.k2)] Scan[join_left AS l] Scan[join_right AS r]` | 200512.00 | 15.060 | 15.291 | -| 1 | `Project[left_payload=col(l.payload), right_payload=col(r.payload)] Join[col(l.k1) = col(r.k1) AND col(l.k2) = col(r.k2)] Scan[join_right AS r] Scan[join_left AS l]` | 200512.00 | 15.361 | 15.564 | +| 0 (chosen) | `Project[left_payload=col(l.payload), right_payload=col(r.payload)] Join[col(l.k1) = col(r.k1) AND col(l.k2) = col(r.k2)] Scan[join_left AS l] Scan[join_right AS r]` | 200512.00 | 14.980 | 15.336 | +| 1 | `Project[left_payload=col(l.payload), right_payload=col(r.payload)] Join[col(l.k1) = col(r.k1) AND col(l.k2) = col(r.k2)] Scan[join_right AS r] Scan[join_left AS l]` | 200512.00 | 15.259 | 15.411 | -interpreted (chosen plan): 5707.965 / 5737.780 ms; rows=100000 checksum=0xd6eff9218be6da07 bag checksum=0xe60844c222869ce8 +interpreted (chosen plan): 5371.034 / 5371.453 ms; rows=100000 checksum=0xd6eff9218be6da07 bag checksum=0xe60844c222869ce8 ### hump-and-bowl @@ -315,12 +315,12 @@ memo: 11 groups, 2 iterations, fired rules: JoinCommuteRule, FilterIntoJoinRule, | alternative | plan | total cost | vectorized min ms | vectorized median ms | |---:|---|---:|---:|---:| -| 0 (chosen) | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(l.filter_key) < lit(80)] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241486.08 | 27.881 | 27.934 | -| 1 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(l.filter_key) < lit(80)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l]` | 241486.08 | 25.992 | 26.419 | -| 2 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Filter[col(l.filter_key) < lit(80)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 283072.00 | 24.780 | 24.812 | -| 3 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Filter[col(l.filter_key) < lit(80)] Scan[e2e_left AS l]` | 283072.00 | 23.322 | 23.467 | +| 0 (chosen) | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(l.filter_key) < lit(80)] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241486.08 | 27.902 | 27.962 | +| 1 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(l.filter_key) < lit(80)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l]` | 241486.08 | 24.255 | 24.480 | +| 2 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Filter[col(l.filter_key) < lit(80)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 283072.00 | 23.469 | 23.535 | +| 3 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Filter[col(l.filter_key) < lit(80)] Scan[e2e_left AS l]` | 283072.00 | 22.325 | 22.540 | -interpreted (chosen plan): 4175.083 / 4200.672 ms; rows=20 checksum=0xae466c9b0f225c78 bag checksum=0x5ad6701e8dbf32d5 +interpreted (chosen plan): 3980.626 / 3984.166 ms; rows=20 checksum=0xae466c9b0f225c78 bag checksum=0x5ad6701e8dbf32d5 ### three-trains @@ -332,32 +332,32 @@ memo: 22 groups, 3 iterations, fired rules: JoinCommuteRule, JoinCommuteRule, Jo | alternative | plan | total cost | vectorized min ms | vectorized median ms | |---:|---|---:|---:|---:| -| 0 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r] Scan[e2e_class AS c]` | 241224.68 | 39.776 | 39.897 | -| 1 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l] Scan[e2e_class AS c]` | 241224.68 | 34.654 | 34.667 | -| 2 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241224.68 | 32.942 | 32.990 | -| 3 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l]` | 241224.68 | 30.710 | 30.725 | -| 4 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c]` | 241096.68 | 36.685 | 36.737 | -| 5 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 241096.68 | 32.799 | 32.900 | -| 6 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 241096.68 | 39.762 | 39.825 | -| 7 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241096.68 | 29.400 | 29.418 | -| 8 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 241109.48 | 27.592 | 27.625 | -| 9 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 241109.48 | 24.504 | 24.548 | -| 10 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241109.48 | 25.881 | 25.902 | -| 11 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l]` | 241109.48 | 23.560 | 23.607 | -| 12 (chosen) | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 240866.28 | 16.510 | 16.563 | -| 13 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 240866.28 | 15.168 | 15.200 | -| 14 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 240866.28 | 17.779 | 17.896 | -| 15 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 240866.28 | 14.535 | 14.738 | -| 16 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c]` | 240981.48 | 26.074 | 26.108 | -| 17 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 240981.48 | 21.237 | 21.333 | -| 18 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 240866.28 | 16.506 | 16.541 | -| 19 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 240866.28 | 15.267 | 15.569 | -| 20 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 240981.48 | 26.842 | 26.997 | -| 21 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 240981.48 | 20.516 | 20.581 | -| 22 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 240866.28 | 17.074 | 17.142 | -| 23 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 240866.28 | 14.410 | 14.423 | - -interpreted (chosen plan): 1591.984 / 1601.294 ms; rows=20 checksum=0x7e53943623dc6b01 bag checksum=0x8f1c966523a83a50 +| 0 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r] Scan[e2e_class AS c]` | 241224.68 | 39.877 | 39.906 | +| 1 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l] Scan[e2e_class AS c]` | 241224.68 | 34.750 | 34.792 | +| 2 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241224.68 | 32.989 | 33.196 | +| 3 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l]` | 241224.68 | 30.725 | 30.800 | +| 4 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c]` | 241096.68 | 36.855 | 36.994 | +| 5 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 241096.68 | 32.819 | 32.963 | +| 6 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 241096.68 | 39.707 | 39.832 | +| 7 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Filter[col(c.tier) = lit(1)] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241096.68 | 29.410 | 29.494 | +| 8 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 241109.48 | 27.550 | 27.610 | +| 9 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 241109.48 | 24.584 | 24.666 | +| 10 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 241109.48 | 26.094 | 26.409 | +| 11 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Scan[e2e_left AS l]` | 241109.48 | 23.627 | 23.717 | +| 12 (chosen) | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 240866.28 | 16.589 | 16.705 | +| 13 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 240866.28 | 15.119 | 15.181 | +| 14 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 240866.28 | 17.009 | 17.070 | +| 15 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 240866.28 | 14.371 | 14.482 | +| 16 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c]` | 240981.48 | 26.054 | 26.265 | +| 17 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 240981.48 | 21.168 | 21.207 | +| 18 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c]` | 240866.28 | 16.574 | 16.649 | +| 19 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Scan[e2e_right AS r] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l]` | 240866.28 | 15.278 | 15.349 | +| 20 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 240981.48 | 26.464 | 26.671 | +| 21 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Filter[col(c.tier) = lit(1)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 240981.48 | 20.370 | 20.439 | +| 22 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Scan[e2e_left AS l] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_right AS r]` | 240866.28 | 17.032 | 17.058 | +| 23 | `Limit[20] Sort[col(n) DESC, col(group_id) ASC] Project[group_id=col(l.group_id), n=col(COUNT(*)), top=col(MAX(r.measure))] Aggregate[group_keys=[col(l.group_id)], aggregates=[COUNT(*), MAX(r.measure)=col(r.measure)]] Join[col(l.k) = col(r.k)] Join[col(l.group_id) = col(c.group_id)] Filter[col(c.tier) = lit(1)] Scan[e2e_class AS c] Scan[e2e_left AS l] Scan[e2e_right AS r]` | 240866.28 | 14.456 | 14.509 | + +interpreted (chosen plan): 1540.199 / 1541.353 ms; rows=20 checksum=0x7e53943623dc6b01 bag checksum=0x8f1c966523a83a50 ### special @@ -369,18 +369,18 @@ memo: 7 groups, 1 iterations, fired rules: InToSemiJoinRule | alternative | plan | total cost | vectorized min ms | vectorized median ms | |---:|---|---:|---:|---:| -| 0 (chosen) | `Project[payload=col(l.payload)] Filter[col(l.k1) IN subquery(IN subquery at position 59)] Subquery[IN subquery at position 59] Project[r.k1=col(r.k1)] Filter[col(r.payload) = lit(10000)] Scan[join_right AS r] Scan[join_left AS l]` | 200512.00 | 3.063 | 3.151 | -| 1 | `Project[payload=col(l.payload)] SemiJoin[col(l.k1) = col(r.k1)] Scan[join_left AS l] Project[r.k1=col(r.k1)] Filter[col(r.payload) = lit(10000)] Scan[join_right AS r]` | 200537.60 | 5.250 | 5.272 | +| 0 (chosen) | `Project[payload=col(l.payload)] Filter[col(l.k1) IN subquery(IN subquery at position 59)] Subquery[IN subquery at position 59] Project[r.k1=col(r.k1)] Filter[col(r.payload) = lit(10000)] Scan[join_right AS r] Scan[join_left AS l]` | 200512.00 | 3.037 | 3.043 | +| 1 | `Project[payload=col(l.payload)] SemiJoin[col(l.k1) = col(r.k1)] Scan[join_left AS l] Project[r.k1=col(r.k1)] Filter[col(r.payload) = lit(10000)] Scan[join_right AS r]` | 200537.60 | 5.135 | 5.147 | -interpreted (chosen plan): 8.902 / 9.068 ms; rows=6250 checksum=0x72a0d9bc69515c7e bag checksum=0x5b144f1cb20c62ff +interpreted (chosen plan): 8.562 / 8.602 ms; rows=6250 checksum=0x72a0d9bc69515c7e bag checksum=0x5b144f1cb20c62ff ### hump workloads | workload | predicate | kept | interpreted min ms | interpreted median ms | vectorized min ms | vectorized median ms | |---|---|---:|---:|---:|---:|---:| -| scan_filter_1pct | `bucket = 7` | 2000 | 17.409 | 17.525 | 7.904 | 7.949 | -| scan_filter_10pct | `decile = 3` | 20000 | 18.751 | 18.816 | 9.067 | 9.089 | -| scan_filter_50pct | `half = 1` | 100000 | 25.338 | 25.427 | 14.235 | 14.249 | +| scan_filter_1pct | `bucket = 7` | 2000 | 16.640 | 16.784 | 7.687 | 7.773 | +| scan_filter_10pct | `decile = 3` | 20000 | 18.231 | 18.320 | 8.815 | 8.859 | +| scan_filter_50pct | `half = 1` | 100000 | 24.571 | 24.761 | 13.900 | 13.927 | ### three_way_route in sql_bench @@ -390,4 +390,4 @@ five repetitions, checksum before timing: | workload | rows | correctness | interpreted min ms | interpreted median ms | vectorized min ms | vectorized median ms | median speedup | |---|---:|---|---:|---:|---:|---:|---:| -| three_way_route | left=120000,right=256,class=128 | match rows=20 checksum=0x7e53943623dc6b01 | 5829.809 | 5843.328 | 39.476 | 39.516 | 147.871x | +| three_way_route | left=120000,right=256,class=128 | match rows=20 checksum=0x7e53943623dc6b01 | 5938.517 | 5941.286 | 40.075 | 40.103 | 148.150x | diff --git a/docs/yard/yard-routes.json b/docs/yard/yard-routes.json index 3126fa6..408af0f 100644 --- a/docs/yard/yard-routes.json +++ b/docs/yard/yard-routes.json @@ -1,8 +1,8 @@ { "engine": { "repo": "github.com/Aly700/vectorized-sql-engine", - "commit": "1058974ea747", - "exportedAt": "2026-09-01", + "commit": "7de892a65834", + "exportedAt": "2026-09-02", "machine": "MacBook Pro Mac14,7, Apple M2, 8 cores, 16 GB", "toolchain": "Apple LLVM 17.0.0 (clang-1700.4.4.1)", "flags": "-O2 -DNDEBUG", @@ -73,7 +73,7 @@ "totalCost": 200512.00, "rowCount": 100000, "bagChecksum": "0xe60844c222869ce8", - "vectorizedMs": { "min": 15.060, "median": 15.291 } + "vectorizedMs": { "min": 14.980, "median": 15.336 } }, { "index": 1, @@ -111,12 +111,12 @@ "totalCost": 200512.00, "rowCount": 100000, "bagChecksum": "0xe60844c222869ce8", - "vectorizedMs": { "min": 15.361, "median": 15.564 } + "vectorizedMs": { "min": 15.259, "median": 15.411 } } ], "chosen": 0, "checksum": "0xd6eff9218be6da07", - "interpretedMs": { "min": 5707.965, "median": 5737.780 }, + "interpretedMs": { "min": 5371.034, "median": 5371.453 }, "hitExpressionBound": false, "hitPlanBound": false }, @@ -228,7 +228,7 @@ "totalCost": 241486.08, "rowCount": 20, "bagChecksum": "0x5ad6701e8dbf32d5", - "vectorizedMs": { "min": 27.881, "median": 27.934 } + "vectorizedMs": { "min": 27.902, "median": 27.962 } }, { "index": 1, @@ -298,7 +298,7 @@ "totalCost": 241486.08, "rowCount": 20, "bagChecksum": "0x5ad6701e8dbf32d5", - "vectorizedMs": { "min": 25.992, "median": 26.419 } + "vectorizedMs": { "min": 24.255, "median": 24.480 } }, { "index": 2, @@ -368,7 +368,7 @@ "totalCost": 283072.00, "rowCount": 20, "bagChecksum": "0x5ad6701e8dbf32d5", - "vectorizedMs": { "min": 24.780, "median": 24.812 } + "vectorizedMs": { "min": 23.469, "median": 23.535 } }, { "index": 3, @@ -438,12 +438,12 @@ "totalCost": 283072.00, "rowCount": 20, "bagChecksum": "0x5ad6701e8dbf32d5", - "vectorizedMs": { "min": 23.322, "median": 23.467 } + "vectorizedMs": { "min": 22.325, "median": 22.540 } } ], "chosen": 0, "checksum": "0xae466c9b0f225c78", - "interpretedMs": { "min": 4175.083, "median": 4200.672 }, + "interpretedMs": { "min": 3980.626, "median": 3984.166 }, "hitExpressionBound": false, "hitPlanBound": false }, @@ -600,7 +600,7 @@ "totalCost": 241224.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 39.776, "median": 39.897 } + "vectorizedMs": { "min": 39.877, "median": 39.906 } }, { "index": 1, @@ -685,7 +685,7 @@ "totalCost": 241224.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 34.654, "median": 34.667 } + "vectorizedMs": { "min": 34.750, "median": 34.792 } }, { "index": 2, @@ -770,7 +770,7 @@ "totalCost": 241224.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 32.942, "median": 32.990 } + "vectorizedMs": { "min": 32.989, "median": 33.196 } }, { "index": 3, @@ -855,7 +855,7 @@ "totalCost": 241224.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 30.710, "median": 30.725 } + "vectorizedMs": { "min": 30.725, "median": 30.800 } }, { "index": 4, @@ -940,7 +940,7 @@ "totalCost": 241096.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 36.685, "median": 36.737 } + "vectorizedMs": { "min": 36.855, "median": 36.994 } }, { "index": 5, @@ -1025,7 +1025,7 @@ "totalCost": 241096.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 32.799, "median": 32.900 } + "vectorizedMs": { "min": 32.819, "median": 32.963 } }, { "index": 6, @@ -1110,7 +1110,7 @@ "totalCost": 241096.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 39.762, "median": 39.825 } + "vectorizedMs": { "min": 39.707, "median": 39.832 } }, { "index": 7, @@ -1195,7 +1195,7 @@ "totalCost": 241096.68, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 29.400, "median": 29.418 } + "vectorizedMs": { "min": 29.410, "median": 29.494 } }, { "index": 8, @@ -1280,7 +1280,7 @@ "totalCost": 241109.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 27.592, "median": 27.625 } + "vectorizedMs": { "min": 27.550, "median": 27.610 } }, { "index": 9, @@ -1365,7 +1365,7 @@ "totalCost": 241109.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 24.504, "median": 24.548 } + "vectorizedMs": { "min": 24.584, "median": 24.666 } }, { "index": 10, @@ -1450,7 +1450,7 @@ "totalCost": 241109.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 25.881, "median": 25.902 } + "vectorizedMs": { "min": 26.094, "median": 26.409 } }, { "index": 11, @@ -1535,7 +1535,7 @@ "totalCost": 241109.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 23.560, "median": 23.607 } + "vectorizedMs": { "min": 23.627, "median": 23.717 } }, { "index": 12, @@ -1620,7 +1620,7 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 16.510, "median": 16.563 } + "vectorizedMs": { "min": 16.589, "median": 16.705 } }, { "index": 13, @@ -1705,7 +1705,7 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 15.168, "median": 15.200 } + "vectorizedMs": { "min": 15.119, "median": 15.181 } }, { "index": 14, @@ -1790,7 +1790,7 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 17.779, "median": 17.896 } + "vectorizedMs": { "min": 17.009, "median": 17.070 } }, { "index": 15, @@ -1875,7 +1875,7 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 14.535, "median": 14.738 } + "vectorizedMs": { "min": 14.371, "median": 14.482 } }, { "index": 16, @@ -1960,7 +1960,7 @@ "totalCost": 240981.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 26.074, "median": 26.108 } + "vectorizedMs": { "min": 26.054, "median": 26.265 } }, { "index": 17, @@ -2045,7 +2045,7 @@ "totalCost": 240981.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 21.237, "median": 21.333 } + "vectorizedMs": { "min": 21.168, "median": 21.207 } }, { "index": 18, @@ -2130,7 +2130,7 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 16.506, "median": 16.541 } + "vectorizedMs": { "min": 16.574, "median": 16.649 } }, { "index": 19, @@ -2215,7 +2215,7 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 15.267, "median": 15.569 } + "vectorizedMs": { "min": 15.278, "median": 15.349 } }, { "index": 20, @@ -2300,7 +2300,7 @@ "totalCost": 240981.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 26.842, "median": 26.997 } + "vectorizedMs": { "min": 26.464, "median": 26.671 } }, { "index": 21, @@ -2385,7 +2385,7 @@ "totalCost": 240981.48, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 20.516, "median": 20.581 } + "vectorizedMs": { "min": 20.370, "median": 20.439 } }, { "index": 22, @@ -2470,7 +2470,7 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 17.074, "median": 17.142 } + "vectorizedMs": { "min": 17.032, "median": 17.058 } }, { "index": 23, @@ -2555,12 +2555,12 @@ "totalCost": 240866.28, "rowCount": 20, "bagChecksum": "0x8f1c966523a83a50", - "vectorizedMs": { "min": 14.410, "median": 14.423 } + "vectorizedMs": { "min": 14.456, "median": 14.509 } } ], "chosen": 12, "checksum": "0x7e53943623dc6b01", - "interpretedMs": { "min": 1591.984, "median": 1601.294 }, + "interpretedMs": { "min": 1540.199, "median": 1541.353 }, "hitExpressionBound": false, "hitPlanBound": false }, @@ -2619,6 +2619,37 @@ "rows": 100000.00, "cost": 100000.00, "children": [] + }, + { + "op": "Subquery", + "detail": "Subquery[IN subquery at position 59]", + "rows": 25.60, + "cost": 512.00, + "children": [ + { + "op": "Project", + "detail": "r.k1=col(r.k1)", + "rows": 25.60, + "cost": 512.00, + "children": [ + { + "op": "Filter", + "detail": "col(r.payload) = lit(10000)", + "rows": 25.60, + "cost": 512.00, + "children": [ + { + "op": "Scan", + "detail": "join_right AS r", + "rows": 256.00, + "cost": 256.00, + "children": [] + } + ] + } + ] + } + ] } ] } @@ -2627,7 +2658,7 @@ "totalCost": 200512.00, "rowCount": 6250, "bagChecksum": "0x5b144f1cb20c62ff", - "vectorizedMs": { "min": 3.063, "median": 3.151 } + "vectorizedMs": { "min": 3.037, "median": 3.043 } }, { "index": 1, @@ -2681,19 +2712,19 @@ "totalCost": 200537.60, "rowCount": 6250, "bagChecksum": "0x5b144f1cb20c62ff", - "vectorizedMs": { "min": 5.250, "median": 5.272 } + "vectorizedMs": { "min": 5.135, "median": 5.147 } } ], "chosen": 0, "checksum": "0x72a0d9bc69515c7e", - "interpretedMs": { "min": 8.902, "median": 9.068 }, + "interpretedMs": { "min": 8.562, "median": 8.602 }, "hitExpressionBound": false, "hitPlanBound": false } ], "hump": [ - { "id": "scan_filter_1pct", "sql": "SELECT a FROM fact WHERE bucket = 7", "predicate": "bucket = 7", "kept": 2000, "of": 200000, "checksum": "0x95ba2cbd0a720591", "interpretedMs": { "min": 17.409, "median": 17.525 }, "vectorizedMs": { "min": 7.904, "median": 7.949 } }, - { "id": "scan_filter_10pct", "sql": "SELECT a FROM fact WHERE decile = 3", "predicate": "decile = 3", "kept": 20000, "of": 200000, "checksum": "0x8031b34dc1b05c00", "interpretedMs": { "min": 18.751, "median": 18.816 }, "vectorizedMs": { "min": 9.067, "median": 9.089 } }, - { "id": "scan_filter_50pct", "sql": "SELECT a FROM fact WHERE half = 1", "predicate": "half = 1", "kept": 100000, "of": 200000, "checksum": "0xd4bb87b7e1354cb7", "interpretedMs": { "min": 25.338, "median": 25.427 }, "vectorizedMs": { "min": 14.235, "median": 14.249 } } + { "id": "scan_filter_1pct", "sql": "SELECT a FROM fact WHERE bucket = 7", "predicate": "bucket = 7", "kept": 2000, "of": 200000, "checksum": "0x95ba2cbd0a720591", "interpretedMs": { "min": 16.640, "median": 16.784 }, "vectorizedMs": { "min": 7.687, "median": 7.773 } }, + { "id": "scan_filter_10pct", "sql": "SELECT a FROM fact WHERE decile = 3", "predicate": "decile = 3", "kept": 20000, "of": 200000, "checksum": "0x8031b34dc1b05c00", "interpretedMs": { "min": 18.231, "median": 18.320 }, "vectorizedMs": { "min": 8.815, "median": 8.859 } }, + { "id": "scan_filter_50pct", "sql": "SELECT a FROM fact WHERE half = 1", "predicate": "half = 1", "kept": 100000, "of": 200000, "checksum": "0xd4bb87b7e1354cb7", "interpretedMs": { "min": 24.571, "median": 24.761 }, "vectorizedMs": { "min": 13.900, "median": 13.927 } } ] }