-
Type:
Improvement
-
Resolution: Fixed
-
Priority:
Major - P3
-
Affects Version/s: None
-
Component/s: None
-
Query Optimization
-
Fully Compatible
-
QO 2024-02-19, QO 2024-03-04
-
51
-
None
-
None
-
None
-
None
-
None
-
None
-
None
Currently the MatchExpression $or->$in rewrite is only capable of collapsing a single field with multiple equality disjunctions into a $in. For example,
{ $or: [
{ a: 10 },
{ b: 11 },
{ c: 12 },
{ d: 13 },
{ a: 14 },
{ b: 15 },
{ c: 16 },
{ d: 17 },
{ a: 18 },
{ b: 19 }
]
}
is optimized to
{
$or: [
{ b: 11 },
{ b: 15 },
{ b: 19 },
{ c: 12 },
{ c: 16 },
{ d: 13 },
{ d: 17 },
{ a: { $in : [ 10, 14, 18 ] } }
]
}
This leads to an SBE plan with a large number of unnecessary comparisons. SBE is able to evaluate $in predicates more efficiently by using a hashset, and the interval builder is able to generate index bounds more easily on an $in list.
These expressions can be further reduce by allowing the $or->$in rewrite to handle multiple fields.
There are two high-value workloads (MatchExpressionWidePredicate and MatchExpressionWidePredicateWithDeepFieldpaths) which could be improved by this optimization.