Re: Optimizing nbtree ScalarArrayOp execution, allowing multi-column ordered scans, skip scan
Alena Rybakina <lena.ribackina@yandex.ru>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Move nbtree preprocessing into new .c file.
- 597b1ffbf123 18.0 landed
-
Fix nbtree lookahead overflow bug.
- 09a8407dbfd8 18.0 landed
- 6749d4aabe74 17.0 landed
-
Remove unneeded nbtree array preprocessing assert.
- 480bc6e3ed3a 17.0 landed
-
Don't try to fix eliminated nbtree array scan keys.
- f22e17f76cf5 17.0 landed
-
Remove redundant nbtree preprocessing assertions.
- 3b08133cd13c 17.0 landed
-
Avoid extra lookups with nbtree array inequalities.
- 473411fc5115 17.0 landed
-
Enhance nbtree ScalarArrayOp execution.
- 5bf748b86bc6 17.0 landed
-
Improvements and fixes for e0b1ee17dc
- 7e6fb5da41d8 17.0 cited
-
Skip checking of scan keys required for directional scan in B-tree
- e0b1ee17dc3a 17.0 cited
-
Fix btmarkpos/btrestrpos array key wraparound bug.
- 714780dcddf0 17.0 cited
-
Add nbtree high key "continuescan" optimization.
- 29b64d1de7c7 12.0 cited
-
Consider secondary factors during nbtree splits.
- fab250243387 12.0 cited
-
Make heap TID a tiebreaker nbtree index column.
- dd299df8189b 12.0 cited
-
Fix planning of btree index scans using ScalarArrayOpExpr quals.
- 807a40c551dd 9.3.0 cited
-
Fix btree stop-at-nulls logic properly.
- 882368e854b6 9.2.0 cited
-
Teach btree to handle ScalarArrayOpExpr quals natively.
- 9e8da0f75731 9.2.0 cited
Hi, all! > CNF -> DNF conversion > ===================== > > Like many great papers, the MDAM paper takes one core idea, and finds > ways to leverage it to the hilt. Here the core idea is to take > predicates in conjunctive normal form (an "AND of ORs"), and convert > them into disjunctive normal form (an "OR of ANDs"). DNF quals are > logically equivalent to CNF quals, but ideally suited to SAOP-array > style processing by an ordered B-Tree index scan -- they reduce > everything to a series of non-overlapping primitive index scans, that > can be processed in keyspace order. We already do this today in the > case of SAOPs, in effect. The nbtree "next array keys" state machine > already materializes values that can be seen as MDAM style DNF single > value predicates. The state machine works by outputting the cartesian > product of each array as a multi-column index is scanned, but that > could be taken a lot further in the future. We can use essentially the > same kind of state machine to do everything described in the paper -- > ultimately, it just needs to output a list of disjuncts, like the DNF > clauses that the paper shows in "Table 3". > > In theory, anything can be supported via a sufficiently complete CNF > -> DNF conversion framework. There will likely always be the potential > for unsafe/unsupported clauses and/or types in an extensible system > like Postgres, though. So we will probably need to retain some notion > of safety. It seems like more of a job for nbtree preprocessing (or > some suitably index-AM-agnostic version of the same idea) than the > optimizer, in any case. But that's not entirely true, either (that > would be far too easy). > > The optimizer still needs to optimize. It can't very well do that > without having some kind of advanced notice of what is and is not > supported by the index AM. And, the index AM cannot just unilaterally > decide that index quals actually should be treated as filter/qpquals, > after all -- it doesn't get a veto. So there is a mutual dependency > that needs to be resolved. I suspect that there needs to be a two way > conversation between the optimizer and nbtree code to break the > dependency -- a callback that does some of the preprocessing work > during planning. Tom said something along the same lines in passing, > when discussing the MDAM paper last year [2]. Much work remains here. > Honestly, I'm just reading and delving into this thread and other topics related to it, so excuse me if I ask you a few obvious questions. I noticed that you are going to add CNF->DNF transformation at the index construction stage. If I understand correctly, you will rewrite restrictinfo node, change boolean "AND" expressions to "OR" expressions, but would it be possible to apply such a procedure earlier? Otherwise I suppose you could face the problem of incorrect selectivity of the calculation and, consequently, the cardinality calculation? I can't clearly understand at what stage it is clear that the such a transformation needs to be applied? -- Regards, Alena Rybakina Postgres Professional