本文介绍PolarDB MySQL版列存表在单机执行阶段的加速能力、性能表现和观测方法。默认情况下,列存查询会优先由优化器选择是否走MPP计划,当查询被调度到某个执行节点后,节点内部仍然依赖单机列执行优化来降低时延。本文重点介绍这部分节点内执行优化能力。
背景与价值
随着分析型查询数据量持续增长,单机执行容易在以下几个方面成为瓶颈:
读取了查询不需要的列
扫描了最终会被过滤掉的数据块
相同数据页重复读取、重复解码
单机缓存无法覆盖热点数据
大表聚合、Join、排序对CPU和内存带宽要求高
全列存表的列执行加速能力,目标就是把“只读必要列、只处理必要数据、尽量复用已解码结果”落实到执行链路中,从而降低查询时延并提升吞吐。
从执行链路看,这部分优化主要体现在:
按查询所需列读取数据,减少无效列扫描。
将可下推谓词尽量下推到底层存储,提前做Stripe粒度或数据块裁剪。
通过可见性视图快速过滤文件减少无效行进入后续聚合、排序和表达式计算。
复用OSS页缓存与元数据缓存,降低重复读取和重复解码成本。
按批次向执行层输送数据,发挥向量化批处理优势。
与多机并行能力的关系及判断方法
本文聚焦单机执行加速。关于列存表多机并行执行能力、适用场景和分区设计,请参见多机分析。
如果需要区分某条SQL最终是否走了MPP计划,可以查看执行计划中是否存在Exchange算子。
EXPLAIN SELECT /*+ SET_VAR(imci_plan_use_mpp=forced) */ COUNT(*) FROM nation;若执行计划中出现Exchange算子,说明该SQL可以使用列存多机并行能力。若实际执行计划中出现Exchange算子,则说明该SQL最终按MPP计划执行。反之,如果执行计划中没有Exchange,则表示该SQL按单机计划执行。
性能测试结果
以下是一个规格为32核256 GB,在TPC-H 1 100 GB的全列存表单机热态测试结果:
本文的TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不完全符合TPC-H的所有要求。
Query | Time(s) |
Q1 | 1.175 |
Q2 | 0.178 |
Q3 | 0.577 |
Q4 | 0.433 |
Q5 | 0.522 |
Q6 | 0.366 |
Q7 | 0.633 |
Q8 | 0.528 |
Q9 | 2.817 |
Q10 | 0.935 |
Q11 | 0.218 |
Q12 | 0.535 |
Q13 | 1.255 |
Q14 | 0.442 |
Q15 | 0.889 |
Q16 | 0.553 |
Q17 | 0.738 |
Q18 | 2.381 |
Q19 | 0.759 |
Q20 | 0.453 |
Q21 | 1.308 |
Q22 | 0.299 |
TOTAL | 17.994 |