Presto执行计划 - 分发Statement到不同的QueryExecution
阅读源码时梳理逻辑用,无阅读价值
获取QueryExecution
queryexecution表示一次查询执行,用于启动、停止与管理一个查询,以及统计这个查询的相关信息。
在 经过Antlr 4语法解析起进行语法分析后,最终生成了一个Node
,然后转成Statement,然后再包装成PreparedQuery
再看后续代码,在 dispatchQueryFactory.createDispatchQuery()
方法中对不同类型的Statement 进行分发处理,其中对应的类为:QueryExecutionFactory
1 | preparedQuery = queryPreparer.prepareQuery(session, query); |
1 |
|
QueryExecutionFactory有两个实现类,DataDefinitionExecutionFactory以及SqlQueryExecutionFactory,Statement分配的逻辑见如下表格:
Statement的实现类 | QueryExecutionFactory的实现类 |
---|---|
AddColumn Call Comment CreateRole CreateSchema CreateTable CreateView Deallocate DropColumn DropRole DropSchema DropTable DropView CreateMaterializedView DropMaterializedView Grant GrantRoles Prepare RenameColumn RenameTable RenameView ResetSession Revoke RevokeRoles Rollback SetPath SetRole SetSchemaAuthorization SetSession SetTableAuthorization SetViewAuthorization StartTransaction Use 截止到21年9月,更多见QueryExecutionFactoryModule类的configure方法 |
DataDefinitionExecutionFactory 属于DataDefinitionExecution 范畴的Statement 都有对应的Task |
Query Explain Analyze CreateTableAsSelect Insert Delete Update ShowCatalogs ShowCreate ShowFunctions ShowGrants ShowRoles ShowRoleGrants ShowSchemas ShowSession ShowStats ShowTables ShowColumns DescribeInput DescribeOutput CreateSchema DropSchema RenameSchema SetSchemaAuthorization AddColumn SetTableAuthorization CreateTable RenameTable Comment RenameColumn DropColumn DropTable CreateView RenameView SetViewAuthorization DropView CreateMaterializedView RefreshMaterializedView DropMaterializedView Use SetSession ResetSession StartTransaction Commit Rollback Call CreateRole DropRole GrantRoles RevokeRoles SetRole Grant Revoke Prepare Deallocate SetPath 截止到21年9月,更多见StatementUtils类的static{}代码块 |
SqlQueryExecutionFactory |
启动QueryExecution
获取QueryExecution之后,SqlQueryQueueManager方法将QueryExecution与配置的查询队列规则进行匹配,如匹配成功且队列未满,则将QueryExecution加入匹配队列。查询队列按照 FIFO规则调度查询。最后启动QueryExecution。
DataDefinitionExecution启动直接调用其绑定的DataDefinitionTask实现类的execute方法即可。以addColumn为例,由于addColumn与addColumnTask绑定,会执行AddColumnTask 的execute方法。
1 |
|
从上面的代码可以发现,这些操作都和metadata 相关,Metadata是定义在io.trino.metadata包下面的接口,它唯一的实现类是 MetadataManager
,该类中关于元数据操作的接口的实现使用了ConnectorMetadata
接口。所有能够介入的数据源的连接器Connector,都采用SPI的机制实现其中的接口(可以部分,看支持的能力),就这样AddColumnTask,通过metadata
接口的实现类调用了Connector plugin 中的具体实现方法。(更多metadata 接口信息见 执行计划中基本概念章节中的 MetadataAPI
SqlQueryExecution启动比较复杂,需要执行查询计划、优化查询计划、分阶段执行查询计划。