[ORCA] Support hash partitioning in ORCA - #1868
Open
zhangwenchao-123 wants to merge 1 commit into
Open
Conversation
GPORCA previously rejected any query touching a hash-partitioned table
and fell back to the Postgres planner. Enable GPORCA to plan such
queries, with static partition pruning for equality predicates and
dynamic (join-driven) partition elimination.
How:
- CTranslatorRelcacheToDXL: stop raising "hash partitioning" for a
single-column, single-level hash partition key and let the strategy
flow into GPORCA. Composite keys, partitioning by expression and
multi-level partitioning still fall back to the planner.
- IMDRelation: add ErelpartitionHash ('h') to the partition-type enum.
- CExpressionPreprocessor: a hash leaf's qual is a
satisfies_hash_partition() call with no btree-interval form, so
PcnstrFromChildPartition now returns NULL instead of asserting. Add
FHashPartitionPruned(): substitute the query's equality constants for
the partition-key columns into that call and evaluate it with the
constant-expression evaluator; a leaf whose call folds to false cannot
hold a matching row and is pruned. This reuses PostgreSQL's exact
hashing (seed, per-column proc, combine), so selection is identical.
- CConstExprEvaluatorDXL: allow folding any column-free immutable
expression (e.g. satisfies_hash_partition over constants), not only
(const cmp const). Volatile/stable and column-referencing expressions
are still rejected.
Dynamic partition elimination needs no hash-specific code: once hash
tables become CLogicalDynamicGet the existing CPhysicalPartitionSelector
path is partition-type agnostic, and CPartPruneStepsBuilder resolves the
strategy from the partition's own hash opfamily.
ORCA vs Postgres planner behavior:
- Partition selection and results are identical. For the supported
single-column, single-level hash key, an equality predicate prunes to
exactly the same surviving partition(s) as the Postgres planner and
returns the same rows row-for-row. When a single partition survives,
both narrow dispatch to that one segment (Gather Motion 1:1).
- Unchanged: composite keys, partitioning by expression and multi-level
partitioning still fall back to the Postgres planner, and range/list
pruning is unaffected.
Authored-by: Zhang Wenchao <zhangwenchao@apache.org>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
GPORCA previously rejected any query touching a hash-partitioned table and fell back to the Postgres planner. Enable GPORCA to plan such queries, with static partition pruning for equality predicates and dynamic (join-driven) partition elimination.
How:
Dynamic partition elimination needs no hash-specific code: once hash tables become CLogicalDynamicGet the existing CPhysicalPartitionSelector path is partition-type agnostic, and CPartPruneStepsBuilder resolves the strategy from the partition's own hash opfamily.
ORCA vs Postgres planner behavior:
Authored-by: Zhang Wenchao zhangwenchao@apache.org
Fixes #ISSUE_Number
What does this PR do?
Type of Change
Breaking Changes
Test Plan
make installcheckmake -C src/test installcheck-cbdb-parallelImpact
Performance:
User-facing changes:
Dependencies:
Checklist
Additional Context
CI Skip Instructions