-
算子级调优 一个查询语句要经过多个算子步骤才会输出最终的结果。由于个别算子耗时过长导致整体查询性能下降的情况比较常见。这些算子是整个查询的瓶颈算子。通用的优化手段是EXPLAIN ANALYZE/PERFORMANCE命令查看执行过程的瓶颈算子,然后进行针对性优化。 如下面的执行过程信息中,Hashagg算子的执行时间占总时间的:(66167-56217)/66878=14.8%,Foreign scan算子的执行时间占总时间的:56217/66878=84%,此处Foreign scan算子就是这个查询的瓶颈算子,在进行性能优化时应当优先考虑此算子的优化,如使用分区表。 同时,对于两个表的Join,如果数据量较大时,且选择了NestLoop,此时该算子性能会比较差。需要设置enable_nestloop=off,选择HashJoin,则性能可以得到较大提升。 父主题: SQL调优进阶
-
更多优化示例 示例:修改select语句,将子查询修改为和主表的join,或者修改为可以提升的subquery,但是在修改前后需要保证语义的正确性。 1 explain (costs off)select * from t1 where t1.c1 in (select t2.c1 from t2 where t1.c2 = t2.c2);
上面示例计划中存在一个subPlan,为了消除这个subPlan可以修改语句为: 1 explain(costs off) select * from t1 where exists (select 1 from t2 where t1.c1 = t2.c1 and t1.c2 = t2.c2);
从计划可以看出,subPlan消除了,计划变成了两个表的semi join,这样会大幅度提高执行效率。
-
规格约束 告警字符串长度上限为2048。如果告警信息超过这个长度(例如存在大量未收集统计信息的超长表名,列名等信息)则不告警,只上报warning: WARNING, "Planner issue report is truncated, the rest of planner issues will be skipped" 如果query存在limit节点(即查询语句中包含limit),则不会上报limit节点以下的Operator级别的告警。 对于“数据倾斜”和“估算不准”两种类型告警,在某一个plan树结构下,只上报下层节点的告警,上层节点不再重复告警。这主要是因为这两种类型的告警可能是因为底层触发上层的。例如,如果在scan节点已经存在数据倾斜,那么在上层的hashagg等其他算子很可能也出现数据倾斜。
-
更多优化示例 示例1:修改基表为REPLICATION表,并且在过滤列上创建索引。 1
2
3 create table master_table (a int);
create table sub_table(a int, b int);
select a from master_table group by a having a in (select a from sub_table);
上述事例中存在一个相关性子查询,为了提升查询的性能,可以将sub_table修改为一个REPLICATION表,并且在字段a上创建一个index。
-
规格约束 告警字符串长度上限为2048。如果告警信息超过这个长度(例如存在大量未收集统计信息的超长表名,列名等信息)则不告警,只上报warning: WARNING, "Planner issue report is truncated, the rest of planner issues will be skipped" 如果query存在limit节点(即查询语句中包含limit),则不会上报limit节点以下的Operator级别的告警。 对于“数据倾斜”和“估算不准”两种类型告警,在某一个plan树结构下,只上报下层节点的告警,上层节点不再重复告警。这主要是因为这两种类型的告警可能是因为底层触发上层的。例如,如果在scan节点已经存在数据倾斜,那么在上层的hashagg等其他算子很可能也出现数据倾斜。