简单拉取数据查询的实现原理
SELECT ss_item_sk, ss_sales_price
FROM store_sales;
执行计划的生成和优化
初始逻辑执行计划
TableScan节点:负责从数据源连接器拉取数据
Output节点:逻辑执行计划的根节点,表示输出计算结果,其自身没有计算逻辑
public class TableScanNode
extends PlanNode
{
// TableHandle表示的是与当前TableScanNode对应的是数据源存储中的那个类
private final TableHandle table;
// outputSymbols: TableScanNode输出的symbols列表,在Presto中使用Symbol表示要输出哪些列
private final List<Symbol> outputSymbols;
// assignments:对于outputSymbols中的每个Symbol,明确其来源于数据源Connector的那个Column(用ColumnHandle表示)
private final Map<Symbol, ColumnHandle> assignments; // symbol -> column
private final TupleDomain<ColumnHandle> enforcedConstraint;
private final boolean forDelete;
查询执行时,只要将TableHandle、ColumnHandl交给数据源连接器,它就知道拉取那些表、哪些列的数据,这是一个基本抽象,在考虑到各种下推优化时,这两个概念将发挥更大的作用