Skip to content

Group Expr

Jianghua.yjh edited this page Sep 22, 2025 · 1 revision

查询分析

这是一个包含相关子查询的KNN(最近邻)查询,需要为每个点找到kd_point_tbl中最近的点。

1. Group结构图

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 (物理计算标量)

2. MEMO结构图

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子句)                     │
└─────────────────────────────────────────────────────────────┤

3. 优化决策流程图

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[生成最终执行计划]
Loading

4. 成本分析决策表

决策点 选项 成本 选择原因
表扫描策略 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 处理相关子查询的必要选择

5. 最终执行计划树

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

关键优化决策

  1. 并行表扫描: 选择ParallelTableScan而非普通TableScan,充分利用Greenplum的MPP架构
  2. 相关子查询处理: 使用CorrelatedLeftOuterNLJoin正确处理包含外部引用的子查询
  3. KNN排序: 为<->操作符创建合适的排序计划支持最近邻搜索
  4. 分布式执行: 通过GatherMotion将分段数据收集到主节点进行最终处理

这个计划展示了ORCA在处理复杂空间查询时的优化能力,特别是在分布式环境下的成本基础优化决策。

Clone this wiki locally