-
-
Notifications
You must be signed in to change notification settings - Fork 0
Group Expr
Jianghua.yjh edited this page Sep 22, 2025
·
1 revision
这是一个包含相关子查询的KNN(最近邻)查询,需要为每个点找到kd_point_tbl中最近的点。
Group 0 (Values扫描)
└── ConstTableGet (物理操作)
Group 1 (kd_point_tbl表扫描)
├── ParallelTableScan (并行扫描)
├── TableScan (顺序扫描)
├── MotionGather (数据收集)
├── Spool (Blocking)
├── MotionBroadcast (广播)
└── Spool (Streaming)
Group 10 (排序操作)
├── ComputeScalar (计算标量)
└── Sort (物理排序)
Group 13 (Limit限制)
├── PhysicalLimit (物理Limit)
└── Spool (Streaming)
Group 17 (根组 - 最终计划)
├── LogicalProject (逻辑投影)
├── LogicalProject (逻辑投影)
└── PhysicalComputeScalar (物理计算标量)
MEMO结构:
┌─────────────────────────────────────────────────────────────┐
│ Group 17 (ROOT) - 最终输出 │
│ └─ PhysicalComputeScalar [Group 22, Group 21] │
├─────────────────────────────────────────────────────────────┤
│ Group 22 - Apply操作 │
│ └─ PhysicalCorrelatedLeftOuterNLJoin [Group 0, Group 13] │
├─────────────────────────────────────────────────────────────┤
│ Group 13 - Limit操作 │
│ └─ PhysicalLimit [Group 10, Group 11, Group 12] │
├─────────────────────────────────────────────────────────────┤
│ Group 10 - 排序和计算 │
│ └─ PhysicalSort [Group 1] │
├─────────────────────────────────────────────────────────────┤
│ Group 1 - 表访问 │
│ └─ ParallelTableScan (kd_point_tbl) │
├─────────────────────────────────────────────────────────────┤
│ Group 0 - 值列表 │
│ └─ PhysicalConstTableGet (VALUES子句) │
└─────────────────────────────────────────────────────────────┤
graph TD
A[查询解析] --> B[初始逻辑计划]
B --> C[Group 0: Values扫描优化]
B --> D[Group 1: 表扫描优化]
C --> E[选择PhysicalConstTableGet]
D --> F{分布式环境决策}
F --> G[选项1: ParallelTableScan + GatherMotion]
F --> H[选项2: TableScan + Broadcast]
F --> I[选项3: 带Spool的方案]
G --> J[成本: 237.87]
H --> K[成本: 240.37]
I --> L[成本: 238.05-240.54]
J --> M[选择最低成本方案]
M --> N[Group 10: 排序优化]
N --> O[选择PhysicalSort]
O --> P[Group 13: Limit优化]
P --> Q[选择PhysicalLimit]
Q --> R[Group 22: Join优化]
R --> S[选择CorrelatedLeftOuterNLJoin]
S --> T[Group 17: 最终输出]
T --> U[选择PhysicalComputeScalar]
U --> V[生成最终执行计划]
| 决策点 | 选项 | 成本 | 选择原因 |
|---|---|---|---|
| 表扫描策略 | ParallelTableScan + GatherMotion | 237.87 | 最低成本,利用并行性 |
| TableScan + Broadcast | 240.37 | 成本较高 | |
| 带Spool的方案 | 238.05-240.54 | 成本不一,非最优 | |
| 排序策略 | PhysicalSort | 265.20 | 支持KNN排序需求 |
| Limit策略 | PhysicalLimit | 265.20 | 标准的Limit实现 |
| Join策略 | CorrelatedNLJoin | 712,998.29 | 处理相关子查询的必要选择 |
PhysicalComputeScalar (Group 17)
└── PhysicalCorrelatedLeftOuterNLJoin (Group 22)
├── PhysicalConstTableGet (Group 0) - 外层Values
└── PhysicalLimit (Group 13)
├── PhysicalSort (Group 10)
│ └── PhysicalComputeScalar (Group 1)
│ └── Materialize
│ └── GatherMotion
│ └── ParallelTableScan (kd_point_tbl)
├── Const(0) - Offset
└── Const(1) - Limit
-
并行表扫描: 选择
ParallelTableScan而非普通TableScan,充分利用Greenplum的MPP架构 -
相关子查询处理: 使用
CorrelatedLeftOuterNLJoin正确处理包含外部引用的子查询 -
KNN排序: 为
<->操作符创建合适的排序计划支持最近邻搜索 -
分布式执行: 通过
GatherMotion将分段数据收集到主节点进行最终处理
这个计划展示了ORCA在处理复杂空间查询时的优化能力,特别是在分布式环境下的成本基础优化决策。