mirror of
https://github.com/postgres/postgres.git
synced 2025-07-09 22:41:56 +03:00
Faster partition pruning
Add a new module backend/partitioning/partprune.c, implementing a more sophisticated algorithm for partition pruning. The new module uses each partition's "boundinfo" for pruning instead of constraint exclusion, based on an idea proposed by Robert Haas of a "pruning program": a list of steps generated from the query quals which are run iteratively to obtain a list of partitions that must be scanned in order to satisfy those quals. At present, this targets planner-time partition pruning, but there exist further patches to apply partition pruning at execution time as well. This commit also moves some definitions from include/catalog/partition.h to a new file include/partitioning/partbounds.h, in an attempt to rationalize partitioning related code. Authors: Amit Langote, David Rowley, Dilip Kumar Reviewers: Robert Haas, Kyotaro Horiguchi, Ashutosh Bapat, Jesper Pedersen. Discussion: https://postgr.es/m/098b9c71-1915-1a2a-8d52-1a7a50ce79e8@lab.ntt.co.jp
This commit is contained in:
@ -1331,6 +1331,32 @@ _readOnConflictExpr(void)
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
static PartitionPruneStepOp *
|
||||
_readPartitionPruneStepOp(void)
|
||||
{
|
||||
READ_LOCALS(PartitionPruneStepOp);
|
||||
|
||||
READ_INT_FIELD(step.step_id);
|
||||
READ_INT_FIELD(opstrategy);
|
||||
READ_NODE_FIELD(exprs);
|
||||
READ_NODE_FIELD(cmpfns);
|
||||
READ_BITMAPSET_FIELD(nullkeys);
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
static PartitionPruneStepCombine *
|
||||
_readPartitionPruneStepCombine(void)
|
||||
{
|
||||
READ_LOCALS(PartitionPruneStepCombine);
|
||||
|
||||
READ_INT_FIELD(step.step_id);
|
||||
READ_ENUM_FIELD(combineOp, PartitionPruneCombineOp);
|
||||
READ_NODE_FIELD(source_stepids);
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
/*
|
||||
* _readMergeAction
|
||||
*/
|
||||
@ -2615,6 +2641,10 @@ parseNodeString(void)
|
||||
return_value = _readOnConflictExpr();
|
||||
else if (MATCH("MERGEACTION", 11))
|
||||
return_value = _readMergeAction();
|
||||
else if (MATCH("PARTITIONPRUNESTEPOP", 20))
|
||||
return_value = _readPartitionPruneStepOp();
|
||||
else if (MATCH("PARTITIONPRUNESTEPCOMBINE", 25))
|
||||
return_value = _readPartitionPruneStepCombine();
|
||||
else if (MATCH("RTE", 3))
|
||||
return_value = _readRangeTblEntry();
|
||||
else if (MATCH("RANGETBLFUNCTION", 16))
|
||||
|
Reference in New Issue
Block a user