在深入研究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