Presto系列 | 四、Presto Query Planner And Optimizer

在深入研究Presto查询规划器和基于成本的优化如何工作之前,让我们先建立一个查询,并针对这个查询进行分析,以帮助理解查询规划的过程。

实例使用了TPC-H数据集,目的是汇总每个nation的所有order的totalprice值并列出排名前五的。

-- 实例一:
SELECT
    (SELECT name FROM region r WHERE regionkey = n.regionkey) AS region_name,
    n.name AS nation_name,
    sum(totalprice) orders_sum
FROM nation n, orders o, customer c
WHERE n.nationkey = c.nationkey
    AND c.custkey = o.custkey
GROUP BY n.nationkey, regionkey, n.name
ORDER BY orders_sum DESC
LIMIT 5;

如上SQL所示:子查询的目的是从region表中提取region_name

一、Parsing and Analysis

在计划执行之前,需要对其进行转化和分析,Presto首先会根据语法规则校验SQL文本,之后就是对查询进行分析:

1.1、确认查询中的Tables

Presto中的表是根据catalogs+Schemas进行组织的,二者确保唯一,因此不同的表Schema下可以具有相同名称的表,例如,TPC-H数据中就有多个表名为orders的表,但是他们在不同的Schema下面,如:sf10.orders 以及 sf100.orders

1.2、标识查询中使用的colums

如SQL中所示,orders.totalprice即明确的引用了order表中的totalprice 列,当SQL中涉及的表里没有相同字段时,通常直接写Column名就可以,Presto Analyzer会自动确定Column来自哪个表。

1.3、确定ROW中Field的引用

单纯的给出一个表达式,如:c.bonus;它的含义可能表示c表中的bonus列,但也可能是指一个复杂类型的列的名字为C,且C中一个字段为bonus,如何区分主要由Presto决定,但如果有冲突发生时,优先按第一种情况处理。 解析过程会遵循SQL语言的作用域和可见性规则, 也会收集一些信息,如标识符消歧,这些收集到的信息稍后会在查询计划规划的过程中使用, 这样Planner 就不需要再次理解理解查询语言的规则,避免重复工作。

Query Analyzer具有复杂的功能, 它的实现是非常有技术性的。对于用户来说,只要用户输入的查询是正确的,那么Query Analyzer对用户就是透明的,只有当查询违反了SQL语法,超过用户权限或由于其他原因导致错误时,Query Analyzer才会主动提示用户;

一旦分析完成,处理并解析了查询中的所有标识符,Presto进入下一个阶段:Query Planning

二、Initial Query Planning

Query P

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值