查询加速

更新时间:
复制为 MD 格式

本文介绍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按单机计划执行。

性能测试结果

以下是一个规格为32256 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