一. 前言
本文主要探究在Presto中是如何处理Limit算子的。以简单的Hive数据源查询select * from testlimit limit 2为例来探讨在Presto中Limit 2是怎么应用到TableScan的。通过本文可以了解到limit算子下推到Hive数据源的TableScan后,TableScan是如何处理的。
二.带Limit算子的计划执行树
在Presto中,Limit算子在经过RBO优化后会下推到尽可能接近数据源的位置。上边的SQL优化后,最后生成的operator的操作顺序为:
虽然从此图看上去像是TableScan将所有的数据读出来后,再经过Limit过滤,再传给下游。但是在Presto中,实现并不是这样的,因为这样会导致TableScan有相当大的资源消耗从而导致查询效率变慢。
在Presto中,采用的是pipeline的执行模式。也就是说,TableScan每扫到一个Page的数据,就立即送给下游的Limit Operation,Limit Operator操作完之后,也立即送给下游。以此同时,TableScan也会继续扫描下一个page的数据,周而复此。
三. TableScan是如何处理Limit算子的
下边详细描述在Presto中是上边的Limit下推到TableScan后,TableScan是如何处理的。
从上图也可以看出来,在TableScan中,不会将数据全部扫描出来才交给Limit算子,而是一个一个Page扫描,扫描的数据满足大于Limit的个数后,Limit算子就通知TableScan停止扫描了,从未减少扫描的数据量。