下⾯介绍⼀下GaussDB在性能优化⽅⾯的⼏个关键技术。
1. 计划缓存(功能类似于绑定变量,减少硬解析的次数,适⽤于执⾏次数多,数量⼩的SQL优化)
计划缓存技术,⼀般在OLTP的业务负载中,因为涉及的数据量较少,通过索引加速数据访问路径后,查询解析、重写、优化占⽐就很⾼。对于模板⾏的语句,可以将模板语句的计划缓存起来,那么同模板不同参数语句执⾏时,可以直接使⽤缓存计划,⼤⼤提升并发吞吐量。我们设想⼀下,缓存计划是针对⼀个session,还是针对整个系统的,由此引申出两个概念,local plan cache和global plan cache。如果只在session上缓存已执⾏计划,可能会导致每个session上执⾏计划都很多,占⽤内存资源较⾼,GPC可以很好解决内存占⽤问题,但维护代价较⼤,管理成本⾼。还有⼀个问题是,缓存计划可能针对某⼀类SQL,如果参数变化后,执⾏计划不优怎么办。GaussDB实现了计划⾃适应选择的能⼒,可以⾃动为不同参数配置最佳的缓存计划。
2. 智能基数估计(感觉在优化O⾥的统计信息,⽐如直⽅图啥的,不过这个⻉叶斯⽹络算⼦模型不太理解,估计也是⼀种针对多列的⼀种模型)
智能基数估计主要解决两个问题:⼀是什么时候创建多列统计信息?⼆是创建什么类型的统计模型?当前常⻅的⽅案是采⽤MCV(⼀种软件架构模式)和直⽅图的统计模型来实现。但这两个⽅案在单列场景估计的⽐较准确,在多列场景中仅⽀持单表,⽽且误差较⼤,⽆法应⽤。GaussDB创新性地设计出基于库内轻量级⻉叶斯⽹络算⼦模型来实现多列场景下的基数估计;基于DB4AI的轻量级算⼦,在数据库内完成训练和推理,对内核⼏乎⽆影响;在⾃动analyze收集统计信息时,⾃动创建⻉叶斯⽹络模型;优化器在进⾏多列基数估计时,调⽤训练好的模型,给出准确率的数值。
3. 分布式查询执⾏(stream算⼦,这个是最复杂的,下⾯仔细说)
GaussDB分布式数据库在查询执⾏过程中,采⽤多种技术提升查询执⾏的性能。其中分布式执⾏框架⽤于实现分布式集群的多节点并⾏处理能⼒,提升集群整体的性能。在复杂语句查询时,会将重执⾏算⼦下推到DN节点执⾏,例如AGG算⼦等。在下推算⼦执⾏时,会考虑数据本地性,尽可能在本地计算,减少数据在⽹络中的传输开销,从⽽提升数据库整体的查询性能。在单节点内,通过SMP并⾏技术,利⽤多核CPU的并⾏加速,结合内存管控,提升单节点的性能。
4. GTM Lite(这个分布式基本都有,保持⼀致性的)
GTM负责全局事务的⼀致性。传统的GTM组件需要维护每⼀个活跃事务信息,作业执⾏时,需要从GTM获取快照时,拿到的是当前的活跃事务链表,如果量特别⼤,将对⽹络并发带来压⼒。GaussDB实现GTM lite能⼒,通过CSN号代替事务链表,获取的快照仅为CSN号,在事务提交时,也只需要原⼦加CSN号。在可⻅性判断时,基于CSN号进⾏,如果事物结束的CSN⽐快照中CSN值⼩,那么元组可⻅,否则元组不可⻅。
5. ⽇志并⾏流⽔线(提⾼⽇志写能⼒,这个⼤部分都有吧)
数据库⽇志系统⾮常关键,是数据持久化的关键保证。因为⽇志有顺序依赖关系,所以传统数据库⼀般采⽤串⾏刷⽇志的设计。GaussDB采⽤log writer⽇志写盘线程并⾏写机制,充分发挥多通道IO的能⼒。GaussDB⽇志并⾏流⽔线主要机制是将⼀把⼤锁,拆分为多个并⾏的⼩锁,部分worker线程的事务⽇志写到⼀个事务⽇志共享缓冲区,每个事务结束前保证对应的事务⽇志LSN已经刷盘,有全局LSN原⼦加保证顺序。
6. NUMA Aware(NUMA不太了解,O都是关)
GaussDB在多核ARM架构下,通过NUMA Aware技术解决跨NUMA内存访问延迟问题。我们主要做了以下动作:全局数据结构NUMA化改造,关键数据结构包括CLOG、Wal insertlock、proc array等,降低了数据访问延迟;将内核⼯作线程与NUMA Node进⾏绑定,避免跨NUMA调度;利⽤原⼦操作指令集LSE,提升计算性能。




