Skip to content

Commit 10dd3dc

Browse files
authored
perf: Fast path for empty inner join (#21965)
1 parent 711ce9a commit 10dd3dc

File tree

1 file changed

+13
-3
lines changed
  • crates/polars-ops/src/frame/join

1 file changed

+13
-3
lines changed

crates/polars-ops/src/frame/join/mod.rs

+13-3
Original file line numberDiff line numberDiff line change
@@ -343,9 +343,19 @@ pub trait DataFrameJoinOps: IntoDf {
343343
},
344344
};
345345
}
346-
347-
let lhs_keys = prepare_keys_multiple(&selected_left, args.nulls_equal)?.into_series();
348-
let rhs_keys = prepare_keys_multiple(&selected_right, args.nulls_equal)?.into_series();
346+
let (lhs_keys, rhs_keys) =
347+
if left_df.is_empty() || other.is_empty() && matches!(&args.how, JoinType::Inner) {
348+
// Fast path for empty inner joins.
349+
// Return 2 dummies so that we don't row-encode.
350+
let a = Series::full_null("".into(), 0, &DataType::Null);
351+
(a.clone(), a)
352+
} else {
353+
// Row encode the keys.
354+
(
355+
prepare_keys_multiple(&selected_left, args.nulls_equal)?.into_series(),
356+
prepare_keys_multiple(&selected_right, args.nulls_equal)?.into_series(),
357+
)
358+
};
349359

350360
let drop_names = if should_coalesce {
351361
if args.how == JoinType::Right {

0 commit comments

Comments
 (0)