Re: generic plans and "initial" pruning
Robert Haas <robertmhaas@gmail.com>
On Fri, Jul 29, 2022 at 11:04 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > We could probably make that work, but I'm skeptical that it would > really be an improvement overall, for a couple of reasons. > > (1) The need for merge-rangetables-and-renumber-Vars logic doesn't > go away. It just moves from setrefs.c to the rewriter, which would > have to do it when expanding views. This would be a net loss > performance-wise, I think, because setrefs.c can do it as part of a > parsetree scan that it has to perform anyway for other housekeeping > reasons; but the rewriter would need a brand new pass over the tree. > Admittedly that pass would only happen for view replacement, but > it's still not open-and-shut that there'd be a performance win. > > (2) The need for varlevelsup and similar fields doesn't go away, > I think, because we need those for semantic purposes such as > discovering the query level that aggregates are associated with. > That means that subquery flattening still has to make a pass over > the tree to touch every Var's varlevelsup; so not having to adjust > varno at the same time would save little. > > I'm not sure whether I think it's a net plus or net minus that > varno would become effectively independent of varlevelsup. > It'd be different from the way we think of them now, for sure, > and I think it'd take awhile to flush out bugs arising from such > a redefinition. Interesting. Thanks for your thoughts. I guess it's not as clear-cut as I thought, but I still can't help feeling like we're doing an awful lot of expensive rearrangement at the end of query planning. I kind of wonder whether varlevelsup is the wrong idea. Like, suppose we instead handed out subquery identifiers serially, sort of like what we do with SubTransactionId values. Then instead of testing whether varlevelsup>0 you test whether varsubqueryid==mysubqueryid. If you flatten a query into its parent, you still need to adjust every var that refers to the dead subquery, but you don't need to adjust vars that refer to subqueries underneath it. Their level changes, but their identity doesn't. Maybe that doesn't really help that much, but it's always struck me as a little unfortunate that we basically test whether a var is equal by testing whether the varno and varlevelsup are equal. That only works if you assume that you can never end up comparing two vars from thoroughly unrelated parts of the tree, such that the subquery one level up from one might be different from the subquery one level up from the other. > > I don't really expect that we're ever going to change this -- and > > certainly not on this thread. The idea of running around and replacing > > RT indexes all over the tree is deeply embedded in the system. But are > > we really sure we want to add a second kind of index that we have to > > run around and adjust at the same time? > > You probably want to avert your eyes from [1], then ;-). Although > I'm far from convinced that the cross-list index fields currently > proposed there are actually necessary; the cost to adjust them > during rangetable merging could outweigh any benefit. I really like the idea of that patch overall, actually; I think permissions checking is a good example of something that shouldn't require walking the whole query tree but currently does. And actually, I think the same thing is true here: we shouldn't need to walk the whole query tree to find the pruning information, but right now we do. I'm just uncertain whether what Amit has implemented is the least-annoying way to go about it... any thoughts on that, specifically as it pertains to this patch? -- Robert Haas EDB: http://www.enterprisedb.com
Commits
-
Stamp 19beta1.
- 4b0bf0788b06 19 (unreleased) cited
-
Revert "Don't lock partitions pruned by initial pruning"
- 1722d5eb05d8 18.0 landed
-
Ensure first ModifyTable rel initialized if all are pruned
- 28317de723b6 18.0 cited
-
Fix bug in cbc127917 to handle nested Append correctly
- cbb9086c9ef6 18.0 landed
-
Remove unstable test suite added by 525392d57
- 4f1b6e5bb4fe 18.0 landed
-
Don't lock partitions pruned by initial pruning
- 525392d5727f 18.0 landed
-
Fix an oversight in cbc127917 to handle MERGE correctly
- 75dfde13639a 18.0 landed
-
Track unpruned relids to avoid processing pruned relations
- cbc127917e04 18.0 landed
-
Perform runtime initial pruning outside ExecInitNode()
- d47cbf474ecb 18.0 landed
-
Move PartitionPruneInfo out of plan nodes into PlannedStmt
- bb3ec16e14de 18.0 landed
-
Fix setrefs.c's failure to do expression processing on prune steps.
- bf826ea06297 18.0 cited
-
Remove obsolete executor cleanup code
- d060e921ea5a 17.0 landed
-
Revert "Move PartitionPruneInfo out of plan nodes into PlannedStmt"
- 5472743d9e85 16.0 landed
-
Move PartitioPruneInfo out of plan nodes into PlannedStmt
- ec386948948c 16.0 landed
-
Refactor and cleanup runtime partition prune code a little
- 297daa9d4353 15.0 landed
-
Remove some unnecessary fields from Plan trees.
- 52ed730d511b 12.0 cited
-
Remove more redundant relation locking during executor startup.
- f2343653f5b2 12.0 cited
-
Shut down Gather's children before shutting down Gather itself.
- acf555bc53ac 10.0 cited