Optimizing Query Predicates with Disjunctions for Column Stores https://arxiv.org/pdf/2002.00540.pdf [abstract at the end of my message]
I just googled [predicate pushdown cnf] and it's WILD to me that this paper came up in the first page of search results, and was published last year. It mentions Spark briefly as an example of a system that "does not seem to implement any additional optimizations [for disjunctions]" Before posting this I googled [spark "2002.00540"] and it didn't appear anyone in the Spark community was talking about it; forgive me if I've missed something as I've only recently joined the list! -0xe1a *Abstract* Since its inception, database research has given limited attention to optimizing predicates with disjunctions. For conjunctions, there exists a “rule-of-thumb” of evaluating predicates in increasing selectivity to minimize unnecessary predicate evaluations. However, for disjunctions, no such rule-of-thumb exists. Furthermore, what little past work there is, has mostly focused on optimizations for traditional row-oriented databases. A key difference in predicate evaluation for row stores and column stores is that while row stores apply predicates to a single record at a time, column stores apply predicates to sets of records. Not only must the execution engine decide the order in which to apply the predicates, but it must also decide how to combine these sets to minimize the total number of records these predicates are applied to. Our goal for this work is to provide a good “rule-of-thumb” algorithm for queries with both conjunctions and disjunctions in a column store setting. We present EvalPred, the first polynomial-time (i.e., O(n log n)) predicate evaluation algorithm with provably optimal guarantees for all predicate expressions of nested depth 2 or less. EvalPred’s optimality is guaranteed under a wide range of cost models, representing different real-world scenarios, as long as the cost model follows a “triangle-inequality”-like property. Yet, despite its powerful guarantees, EvalPred is almost trivially simple and should be easy to implement, even in existing systems. Even for predicate expressions of depth 3 or greater, we show via experimentation that EvalPred comes quite close to optimal with 92% of queries within 5% of optimal. Furthermore, compared to other algorithms, EvalPred achieves average speedups of 2.6× over no disjunction optimization, 1.4× over a greedy algorithm, and 28× over the state-of-the-art for the top 10% of queries.