深度解析DuckDB的ScheduleEvents
- 1.ScheduleEventData
- 2.ScheduleEventsInternal
- 3.SchedulePipeline
- 3.1 Event
- 3.2 PipelineEventStack
- 3.3 主逻辑
- 4.可视化总结
书接上回熬夜三晚之深度解析DuckDB MetaPipeline,MetaPipeline在初始化的时候会构建出下面几个:
- 第一个MetaPipeline
{pipelines[1], children[1]}
代码语言:javascript复制┌───────────────────────────┐
│ RESULT_COLLECTOR │
└───────────────────────────┘
children MetaPipeline
- 上面的child MetaPipeline
{pipelines[2], children[1]}
需要注意Ready()之后除了operators逆序,可以看到operations数组顺序发生了变化。
pipelines[0]
代码语言:javascript复制┌───────────────────────────┐
│ RESULT_COLLECTOR │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ HASH_JOIN │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ INNER │
│ stu_id = id │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ EC: 4 │
│ Cost: 4 │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ PROJECTION │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ name │
│ score │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ SEQ_SCAN │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ score │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ stu_id │
│ score │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ EC: 4 │
└───────────────────────────┘
pipeline[1]
代码语言:javascript复制┌───────────────────────────┐
│ RESULT_COLLECTOR │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ PROJECTION │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ name │
│ score │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ HASH_JOIN │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ INNER │
│ stu_id = id │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ EC: 4 │
│ Cost: 4 │
└───────────────────────────┘
children MetaPipeline
- 上面child MetaPipeline
{pipelines[1], children[0]}
pipeline[0]
代码语言:javascript复制┌───────────────────────────┐
│ HASH_JOIN │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ INNER │
│ stu_id = id │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ EC: 4 │
│ Cost: 4 │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ SEQ_SCAN │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ student │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ id │
│ name │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ EC: 3 │
└───────────────────────────┘
在InitializeInternal
最后有一行非常重要的代码:
ScheduleEvents(to_schedule);
to_schedule为不含root的所有MetaPiple,比如说上面第一个包含下面的pipeline是不在to_schedule里面的,所以total_pipelines为2。
代码语言:javascript复制┌───────────────────────────┐
│ RESULT_COLLECTOR │
└───────────────────────────┘