presto java 分页_Presto分页功能概述

本文详细介绍了如何在Presto中实现分页功能,包括解析新的分页语法、LimitOperator的改进,以及面对分布式执行时的解决方案。通过对LimitOperator的修改以支持offset,解决了offset过大导致的性能问题。文章还探讨了在partial和final阶段的不同处理,并通过测试验证了结果的不确定性。
摘要由CSDN通过智能技术生成

引言

本文假设读者已经熟悉了 Presto QE 执行模型的一些基本概念,比如 Statement、Query、Stage、Task、Split、Driver、Operator、Exchange。

当前社区版的 Presto并不能很好的支持分页语法,究其原因,我的理解是因为当 offset 过大会造成性能的损失,假设 offset 1,000,000 limit 20,则数据库会扫描 1,000,020 行后然后把前一百万行数据给丢掉,该操作的成本比较高,如图1为一个测试结果【具体见文章末尾参考】,当随着offset增大的时候,Query 的执行时间也会跟着变得越来越大。图1

该篇文章以如何实现分页语法功能做为一个开篇,来介绍如何实现一个分页功能在当前 Presto中。在具体开始开始前,先看下 MySQL 和 PostgreSQL 的分页语法。

MySQL分页语法

MySQL 里面提供的分页语法如下,而用户在写SQL的过程中 (比如 limit 3,5 ),该语法由于没有精确的指定Limit 后面的数字到底代表什么含义而显得有些歧义。

Limit offset, limit

PostgreSQL分页语法

PostgreSQL 提供的Limit分页语法如下:

LIMIT { count | ALL } OFFSET start

Presto当前的语法

只能提供 Limit 后加一个参数的语法结构。关于 sql 的语法定义在 SqlBase.g4文件中,可以看到如下的 Limit 语法并不支持偏移量这样的功能。

query

: with? queryNoWith

;

queryNoWith:

queryTerm

(ORDER BY sortItem (',' sortItem)*)?

(LIMIT limit=(INTEGER_VALUE | ALL))?

;

假设我们要给 Presto 的分页语法如下,也即是未来给用户写sql语句的样子,注意这里只是自己定义的一种语法格式,用户也可以随意指定想要的语法格式。

offset x limit y

要让Presto执行引擎能够识别该语法,则首先需要在 SqlBase.g4层面支持这样的语法结构,然后进行词法分析、语法分析最后生成AST树。ANTLR会根据 SqlBase.g4 生成其中 SqlBaseListener 和 SqlBaseVisitor 两个文件。SqlBaseLi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值