于数据库范畴之内,优化器技术一直都被看成是极具挑战性的难题,它就好像是数据库的“大脑”,肩负着把SQL查询转变为最高效执行计划的重大责任。一个优秀的优化器能够直接判定数据库的性能上限,可是,去设计一个健壮又智能的优化器,却得攻克代价估算、计划空间搜索以及统计信息准确性等诸多难关。
这些难关包含多个方面,代价估算得精准衡量诸多操作的成本,计划空间搜索需在海量的可能计划里找出最优解,统计信息准确性是保证优化器决策正确的关键基础。每个环节都满是挑战,唯有成功越过这些难关,方可设计出真正出色的数据库优化器,进而提升整个数据库系统的性能表现。
优化器为何难做
因数据库面对的查询场景丰富多样、千变万化,其涵盖从简单单表过滤操作到涉及几十张表的复杂关联情形,每一种不同情况都必然需采用各异执行策略。在此种状况下,优化器必须在不实际执行所有可能计划的前提条件下,迅速寻找到最优解。然而,可能的执行计划数量会随表数量增加呈指数级增长态势,这就是所谓的“计划爆炸”问题。
极其复杂的是数据库的查询场景,较为基础的只是其中简单的单表过滤部分,更为复杂的是几十张表之间存在的复杂关联。面对这般丰富多样的查询场景,不同种类情况对应着不同的执行策略需求。优化器在不实际执行所有可能计划的情形下,快速找出最优解决方案并非轻而易举之事。随着表数量的增多,可能的执行计划数量会以指数级的速度增长,这种现象就是“计划爆炸”问题。
代价估算怎么准
优化器的核心在于代价估算,它承担着预测每个操作,像扫描、连接、排序等的CPU以及I/O开销的重要任务。可是,数据库中的数据分布常常不遵循均匀分布规律,传统基于直方图的统计信息在高维关联场景中极容易出现失真状况。比如,当多个过滤条件存在相关性时,独立假设会导致估算偏差达到几个数量级。
计划搜索如何高效
在海量的计划空间面前,优化器只能采用剪枝策略。经典方法动态规划,当表数量超过十几张时就会力不从心。遗传算法和基于强化学习的新方法,能扩展搜索边界,却面临收敛不稳定或训练成本过高的问题。在实际生产系统中,要在探索质量与编译时间之间进行痛苦的权衡。
于实际生产系统里,海量计划空间中,优化器得运用剪枝策略。经典方法动态规划,表数量超十几张时则无法应对。遗传算法及基于强化学习的新方法,拓展搜索边界时,存在收敛不稳定或者训练成本过高的情况。如此这般,还得于探索质量与编译时间间做痛苦权衡。
https://gitee.com/zclchenglin/dongfeng01/issues/IIC0NK
https://gitee.com/zclchenglin/dongfeng01/issues/IIB7MX
https://gitee.com/zclchenglin/dongfeng01/issues/IIB7JO
https://gitee.com/zclchenglin/dongfeng01/issues/IIB7DR
https://gitee.com/zclchenglin/dongfeng01/issues/IIB8MT
https://gitee.com/zclchenglin/dongfeng01/issues/IIB8OM
https://weibo.com/ttarticle/p/show?id=2309405286271857066382
https://weibo.com/ttarticle/p/show?id=2309405286267989655637
https://weibo.com/ttarticle/p/show?id=2309405286290345558062