首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Phoenix查询计划剖析

一.概要

在数据库中,执行计划就是表示一条SQL将要执行的步骤,这些步骤按照不同的数据库运算符号(算子)组成,具体的组成和执行方式由数据库中的查询优化器来决定。换而言之,执行计划决定SQL的执行效率。在数据库的使用中了解其查询计划的构成,是进行查询性能调优的必要条件。本文将详细介绍Phoenix的查询计划语法、组成结构,以及一些注意事项。

二.查询计划

1. 基本说明

在Phoenix中,查询计划能告诉我们如下的信息:

将要扫描的CHUNK数量

客户端并发线程数量

执行模式(并行或串行)

查询过滤字段或者扫描范围

将会查询的表名

估算扫描数据bytes大小(依赖stats信息)

估算扫描数据量大小(依赖stats信息)

估算数量bytes大小和数据量时间

操作符被执行在客户端或者服务端

涉及的查询operations(sort、filter, scan, merge, join, limit等)

2. 语法

explain语法示例如下:

3. 如何选择最优查询计划

检查查询计划是否最优,核心有以下几点可以作为参考:

尽量避免出现FULL SCAN,尤其对于不走索引表的单表查询,不应该出现FULL SCAN

执行模式尽可能使用并行(某些情况一定是串行的执行模式)

尽可能将对应表的过滤条件或计算下推到server端

尽可能使用覆盖索引,生成不需要回查数据表的查询计划

三.查询计划详解

1. 操作符说明

UNION ALL: 表示union all查询,操作符后面接查询计划中涉及查询的数量

AGGREGATE INTO SINGLE ROW: 没有groupby语句情况下,聚合查询结果到一行中。例如 count(*)

AGGREGATE INTO ORDERED DISTINCT ROWS:带有group by的分组查询

FILTER BY expression: 过滤出符合表达式条件的数据

INNER-JOIN: 多表Join

MERGE SORT: 进行merge sort排序,大多是客户端对多线程查询结果进行排序

RANGE SCAN: 对主键进行范围扫描,通常有指定start key和stop key

ROUND ROBIN: 对查询没有排序要求,并发的在客户端发起扫描请求。

SKIP SCAN: Phoenix实现的一种扫描方式,通常能比Range scan获得更好的性能。

FULL SCAN: 全表扫描

LIMIT: 对查询结果取TOP N

CLIENT: 在客户端执行相关操作

X-CHUNK: 根据统计信息可以把一个region分成多个CHUNK, X在查询计划中表示将要扫描的CHUNK数量,此处是多线程并发扫描的,并发的数量是由客户端线程池的大小来决定的

PARALLEL X-WAY:描述了有X个并发对scan做merge sort之类的客户端操作

SERIAL: 单线程串行执行

SERVER: 在SERVER端(RS)执行相关操作

2. 查询计划示例说明

分组聚合查询。查询计划中有5385个并发,并行对表做范围扫描,在server端以组合rowkey的第二列k2为过滤条件过滤,并以k2列做聚合。

无排序查询生成ROUND ROBIN查询计划。查询计划中有5385个并发,并行对表做ROUND ROBIN的范围扫描,在server端以组合rowkey的第二列k2为过滤条件过滤。

有排序查询。查询计划中有5385个并发,并行对表做范围扫描,在server端以组合rowkey的第二列k2为过滤条件过滤并排序,最后在客户端进行merge sort查询结果。

四.API访问查询计划信息

五.注意事项

当有两个以上索引表时尽量使用hint去指定查询必须要使用的索引表,这样可以确保即使以后再加了索引不会影响到现在使用的查询计划

能通过数据表组合主键覆盖的查询条件,尽量避免创建索引表。索引表表越多,写放大越严重,维护成本也会随之增加

在查询计划中Scan速度,SKIP SCAN > RANGE SCAN > FULL SCAN

不是所有的查询operations都能下推到server端

查询SERVER FILTER一个普通列,一般会在server端发生全表扫描操作,也需要谨慎检查

组合主键或者组合索引的非前缀列,作为过滤条件列进行查询时,一般会生成SCAN OVER的查询计划,但实际上这种查询也很可能需要全表扫描,所以也需要根据实际情况检查确认

References

https://phoenix.apache.org/explainplan.html

https://phoenix.apache.org/language/index.html

大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190120G0Z7TN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券