Phoenix把SQL翻译成scan,但是一条简单查询的执行计划并没有看到filter,那么Phoenix中select字段是否有对应的FamilyFilter或者QualifierFilter呢,也就是应该在scan的时候addFamily或者addColumn。
select
考虑这样一条SQL
|
|
这是一条join语句,执行过程应该是scan b并且加上filter,scan a也加上filter,然后join,b的filter是由where语句和select字段决定的,a的filter应该是由select字段决定的,也就是本条语句应该不涉及到a除cf1之外的cf和b除cf2之外的cf。
phoenix过程
在之前的一篇博客,有说过一条select语句经过antlr-》parser-》statement,然后调用statement的executeQuery()方法,executeQuery()又分为,先得到QueryPlan,再进行optimize(),然后由QueryPlan得到对应的Iterator,最后返回的是resultSet。调用resultSet的next方法会调用iterator的next方法,下面看/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
的initializeScan(),它是把每个scan都加上了select的projection。这里的iterator是构建scan的,采用装饰器模式,一层一层的加上去。
|
|