Explain
1.执行所有的 Hbase 范围查询
2.估算scan的字节数
3.估算传输的row数
4.以上估算时间
5.需要扫描的表
6.在服务与客户端的操作如:sort merge scan limit
EXPLAIN sql -- 打印执行计划,修改语句使满足如下条件:
1.尽量让操作在server端。服务端的操作是分布在集群上的,并行操作。
2.尽可能使用RANGE SCAN or SKIP SCAN,比起 TABLE SCAN
3.过滤条件采用主键。
4.如果必要,引入本地索引或者 全局索引那个转换你的查询
5.如果有一个索引能覆盖你的查询,但是被删除了,用 SELECT /* + INDEX() */
Anatomy of Explain Plan
1.AGGREGATE INTO ORDERED DISTINCT ROWS -- 把返回的结果进行聚合,如求和。如果出现ORDERED,GROUP BY 应用到了PK上,它允许在合适的地方进行聚合操作,而不是保存所有的 distinct组在服务器的内存里
2.AGGREGATE INTO SINGLE ROW -- 把所有结果聚合成一行,如 count(*)
3.CLIENT -- 操作在client端进行。如果出现这种情况,可能需要重新写SQL,尽可能多的操作在服务端
4.FILTER BY expression -- 返回的匹配expression的结果
5.FULL SCAN OVER tableName -- 全表扫描
6.INNER-JOIN -- 多个表进行连接,如果连接条件满足
7.MERGR SORT -- 对结果进行合并排序
8.RANGE SCAN OVER tableName [...] -- [start stop] 指示primary key 开始与结束位置
9.ROUND ROBIN -- 如果返回结果不需要 order by ,返回的结果是无序的,在客户端启动最大的并行度
10.X-CHUNK -- 描述有多少线程应该在这个操作上。最大的并行是被线程池限制的。最小的线程数与扫描的table的数据所有的regions数相同
11.PARALLELx-WAY -- 有多少个并行扫描合并排序在操作中
12.SERIAL -- 连续操作,如 一行的查找 过滤条件是 PK ,并且结果是被限制的
13.EST_BYTES_READ -- 估算总共有多少个字节作为扫描的查询的部分
14.EST_ROW_READ -- 估算总共有多少行作为扫描查询的部分
15.EST_INFO_TS -- 收集信息需要多少毫秒
JDBC Explain Plan API and estimates information
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);
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);
}