




SQL数据库算子执行模型分拉取式和推送式:拉取式由下游主动请求数据,适用于OLTP和复杂查询;推送式由上游主动发送数据,适合OLAP向量化与MPP场景;现代系统常混合使用二者。
SQL数据库的算子执行模型主要分为拉取式(Pull-based)和推送式(Push-based)两种,核心区别在于数据流动的控制权归属:拉取式由下游算子主动请求数据,推送式由上游算子主动发送数据。
拉取式是传统关系数据库(如Po
stgreSQL、MySQL优化器)广泛采用的方式。执行时,根节点(如SELECT)发起next()调用,逐层向下触发子节点计算并返回一批元组(通常为1行或小批量),形成“迭代器树”结构。
推送式常见于现代列存分析引擎(如Doris、StarRocks、ClickHouse的部分执行阶段)及流处理系统。上游算子完成一批数据处理后,直接调用下游consume()接口推送数据块,控制流由数据生产者主导。
二者并非互斥,实际系统常混合使用。例如Spark SQL物理计划中ShuffleExchange采用推送,而Filter/Project仍以拉取语义建模;TiDB的MPP模式中CN节点拉取,DN节点间通过RPC推送数据块。
OLTP场景多延续拉取式,保障低延迟与事务语义清晰;OLAP引擎则越来越多融合推送式,尤其在向量化、MPP、GPU加速等高性能路径中。新一代执行器(如DuckDB的VAAE、Presto的PipelinedQueryRunner)正通过统一抽象(如DataSink/DataSource接口)桥接两类模型,让优化器根据算子类型、数据规模、硬件特征自动选择最适数据流转方式。