[Phoenix] 十一、查询计划详解

简介: 数据库的使用中了解其查询计划的构成,是进行查询性能调优的必要条件。本文将详细介绍Phoenix的查询计划语法、组成结构,以及一些注意事项

一、概要

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

二、查询计划

1. 基本说明

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

  • 将要扫描的CHUNK数量
  • 客户端并发线程数量
  • 执行模式(并行或串行)
  • 查询过滤字段或者扫描范围
  • 将会查询的表名
  • 估算扫描数据bytes大小(依赖stats信息)
  • 估算扫描数据量大小(依赖stats信息)
  • 估算数量bytes大小和数据量时间
  • 操作符被执行在客户端或者服务端
  • 涉及的查询operations(sort、filter, scan, merge, join, limit等)

2. 语法

explain [select... | upsert ... select | delete...] 

explain语法示例如下:

explain SELECT host FROM PTSDB WHERE host IN ('a','b');

explain UPSERT INTO t1 SELECT id FROM t2 ORDER BY K1, V1;

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

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

  1. 尽量避免出现FULL SCAN,尤其对于不走索引表的单表查询,不应该出现FULL SCAN
  2. 执行模式尽可能使用并行(某些情况一定是串行的执行模式)
  3. 尽可能将对应表的过滤条件或计算下推到server端
  4. 尽可能使用覆盖索引,生成不需要回查数据表的查询计划

三、查询计划详解

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列做聚合。

explain select count(k2) from OFFSET_TEST where k2 = '3343' group by k2;
 
CLIENT 5385-CHUNK 2330168 ROWS 314572800 BYTES PARALLEL 5385-WAY RANGE SCAN OVER OFFSET_TEST [0] - [63]
SERVER FILTER BY FIRST KEY ONLY AND K2 = '3343'
SERVER AGGREGATE INTO DISTINCT ROWS BY [K2]
CLIENT MERGE SORT

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

explain select * from OFFSET_TEST where k2 = '3343';

CLIENT 5385-CHUNK 2330168 ROWS 314572800 BYTES PARALLEL 5385-WAY ROUND ROBIN RANGE SCAN OVER OFFSET_TEST [0] - [63] 
SERVER FILTER BY K2 = '3343'

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

explain select * from OFFSET_TEST where k2 = '3343' order by k2;

CLIENT 5385-CHUNK 2330168 ROWS 314572800 BYTES PARALLEL 5385-WAY RANGE SCAN OVER OFFSET_TEST [0] - [63]
    SERVER FILTER BY K2 = '3343'
    SERVER SORTED BY [K2]
CLIENT MERGE SORT

四、API访问查询计划信息

String explainSql = "EXPLAIN SELECT * FROM T";
Long estimatedBytes = null;
Long estimatedRows = null;
Long estimateInfoTs = null;
try (Statement statement = conn.createStatement(explainSql)) {
        int paramIdx = 1;
        ResultSet rs = statement.executeQuery(explainSql);
        
        //打印查询计划
        System.out.println(QueryUtil.getExplainPlan(rs));
        
        //获取相关估算值
        rs.next();
        estimatedBytes =
                (Long) rs.getObject(PhoenixRuntime.EXPLAIN_PLAN_ESTIMATED_BYTES_READ_COLUMN);
        estimatedRows =
                (Long) rs.getObject(PhoenixRuntime.EXPLAIN_PLAN_ESTIMATED_ROWS_READ_COLUMN);
        estimateInfoTs =
                (Long) rs.getObject(PhoenixRuntime.EXPLAIN_PLAN_ESTIMATE_INFO_TS_COLUMN);
}

五、注意事项

  • 当有两个以上索引表时尽量使用hint去指定查询必须要使用的索引表,这样可以确保即使以后再加了索引不会影响到现在使用的查询计划
  • 能通过数据表组合主键覆盖的查询条件,尽量避免创建索引表。索引表表越多,写放大越严重,维护成本也会随之增加
  • 在查询计划中Scan速度,SKIP SCAN > RANGE SCAN > FULL SCAN
  • 不是所有的查询operations都能下推到server端
  • 查询SERVER FILTER一个普通列,一般会在server端发生全表扫描操作,也需要谨慎检查
  • 组合主键或者组合索引的非前缀列,作为过滤条件列进行查询时,一般会生成SCAN OVER的查询计划,但实际上这种查询也很可能需要全表扫描,所以也需要根据实际情况检查确认

References

目录
相关文章
|
分布式计算 DataWorks API
一分钟“零代码”生成API,DataWorks数据服务快速上手指南
DataWorks数据服务提供了快速生成API的能力,可以一分钟“零代码”生成API,本文是一篇快速上手指南,帮助你快速认识数据服务。
12852 0
|
弹性计算 分布式计算 Hadoop
[大数据新手上路]“零基础”系列课程--如何将ECS上的Hadoop数据迁移到阿里云数加·MaxCompute
 想用阿里云数加·大数据计算服务(MaxCompute),但是现在数据还在hadoop上,怎么办?   别烦恼,跟着我们走,来一次MaxCompute零基础数据迁移之旅~Let’s Go!
19295 111
|
分布式计算 关系型数据库 大数据
[ETL实践指南]基于Kettle的MaxCompute插件实现数据上云
本文用到的 阿里云数加-大数据计算服务MaxCompute产品地址:https://www.aliyun.com/product/odps 简介 Kettle是一款开源的ETL工具,纯java实现,可以运行于Windows, Unix, Linux上运行,提供图形化的操作界面,可以通过拖拽控件的方式,方便地定义数据传输的拓扑。
21623 3
|
SQL 物联网 大数据
HBase进化之从NoSQL到NewSQL,凤凰涅槃成就Phoenix
数据爆炸使得传统单机数据库面临一系列挑战,HBase作为NoSQL数据库,解决了大规模数据实时读写的难题。Phoenix项目在HBase的基础上增加了SQL语言表达,算子原地执行,二级索引,加盐表等特性,进化成为了NewSQL数据库,更好用也更强大。
10026 0
|
存储 监控 分布式数据库
HBase在新能源汽车监控系统中的应用
重庆博尼施科技有限公司是一家商用车全周期方案服务商,利用车联网、云计算、移动互联网技术,在物流领域 为商用车的生产、销售、使用、售后、回收各个环节提供一站式解决方案,其中的新能源车辆监控系统就是由该公司提供的,本文是阿里云客户重庆博尼施科技有限公司介绍如何使用阿里云 HBase 来实现新能源车辆监控系统。
7343 0
|
SQL 缓存 安全
如何正确管理HBase的连接
如何正确管理HBase的连接
1224 0
如何正确管理HBase的连接
[Phoenix] 四、加盐表
在密码学中,加盐是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。
11839 0
|
分布式计算 大数据 MaxCompute
【大数据技巧】MaxCompute中实现IP地址归属地转换
大数据平台的成熟使得更多种类的非结构化、半结构化的数据分析成为可能其中应用非常广泛的一种场景就是日志分析。在日志类型数据的清洗转换过程中把IP地址转换为归属地又是极为常见的一种场景。
12228 1
|
运维 流计算
阿里云实时计算产品案例&解决方案汇总
阿里云实时计算产品案例&解决方案汇总页
33419 3
|
存储 域名解析 缓存
HTTPDNS域名解析场景下如何使用Cookie?
1. Cookie 由于HTTP协议是无状态的,为了维护服务端和客户端的会话状态,客户端可存储服务端返回的Cookie,之后请求中可携带Cookie标识状态。 客户端根据服务端返回的携带Set-Cookie的HTTP Header来创建一个Cookie,Set-Cookie为字符串,主要字段如下
11178 4

热门文章

最新文章