云数据库 SelectDB 版支持全新优化器Nereids。相比于旧版优化器,新优化器可以更好的支持多表Join查询,多层子查询嵌套等更为复杂的查询。此外,它减少了优化规则出现逻辑错误的可能性,并且便于扩展优化规则和处理阶段,能够更稳定、迅速地响应业务需求。
功能简介
当下,现代查询优化器面临着更加复杂的查询语句和更加多样化的查询场景等挑战。与此同时,用户对于尽快获得查询结果的需求也日益迫切。SelectDB旧版优化器的架构陈旧,难以满足今后快速迭代的需要。
因此,云数据库 SelectDB 版团队推出了一款现代架构的全新查询优化器Nereids。Nereids优化器针对当前SelectDB场景的查询请求进行了高效优化,提升了处理效能,同时展现出优秀的扩展性,这为其应对未来更复杂的查询需求和进一步的系统扩展打下了坚实的基础。
Nereids优化器特点
更智能
Nereids优化器以规则的形式呈现每个基于规则的优化(RBO)和基于成本的优化(CBO)的优化点。对于每一个规则,Nereids优化器都提供了一组用于描述查询计划形状的模式,可以精确匹配可优化的查询计划。因此,Nereids优化器可以更好的支持诸如多层子查询嵌套等更为复杂的查询语句。
Nereids优化器的CBO基于先进的Cascades框架,使用了更为丰富的数据统计信息,并应用了维度更科学的代价模型,使得Nereids优化器在处理多表Join查询时,更加得心应手。
如下是新旧版优化器在TPC-H SF100下的查询速度比较,其中测试环境为3个BE(集群)节点,每个节点16 core 64 GB内存。新优化器使用标准测试中的原始SQL,执行SQL前收集了统计信息。旧优化器使用原始SQL和手工调优的SQL。可以观察到,在无需手动优化查询的情况下,新的优化器的总体查询性能接近于经过手动优化的旧优化器,远远超过了旧优化器在原始SQL下的性能。
更健壮
Nereids优化器的所有优化规则,均在逻辑执行计划树上完成。在一个查询的语法语义解析完成后,便将其转换为一棵树状结构。这种结构相比于旧优化器的内部数据结构更为合理和统一。以子查询处理为例,Nereids优化器基于新的数据结构,避免了旧优化器中众多规则对子查询的单独处理,从而减少了优化规则出现逻辑错误的可能。
更灵活
Nereids优化器的架构设计更优雅合理,可以方便地扩展优化规则和处理阶段,能够更迅速的响应用户的新需求。
使用方法
开启新优化器。
说明当前已默认开启。
SET enable_nereids_planner=true;
开启自动回退到旧优化器:
SET enable_fallback_to_original_planner=true;
为了能够充分利用新优化器的CBO能力,建议对关注查询性能的表执行ANALYZE语句,以收集更丰富的统计信息。详情请参见统计信息。
注意事项
暂不支持的功能
如果开启了自动回退,则在新优化器出现问题的场合,会自动回退到旧优化器执行。
不支持JSON、Array、Map、Struct 类型:查询的表含有这些类型,或者查询中的函数会输出这些类型时,不支持Nereids优化器。
仅支持的DML:
INSERT INTO SELECT
、UPDATE
、DELETE
。带过滤条件的物化视图。
别名函数。
Java UDF和HDFS UDF。
高并发点查询优化。
已知问题
不支持命中Partition Cache。