当前位置: 首页 > 科技观察

对国内数据库厂商SQL引擎的几点小要求

时间:2023-03-15 22:42:57 科技观察

国内数据库迎来了快速发展的好时期,大量企业用户正在将自己的数据库系统迁移到开源和国产数据库平台。但是,当我们国内的数据库厂商在收割大量用户、“数钱”的时候,广大用户也在期待国产数据库变得更好用。SQL引擎是数据库的核心组件之一。因此,当大量的国内数据库厂商在向内竞争的时候,也需要能够做出一些让广大用户满意的功能。我们的团队从事系统优化和数据库运维工具开发多年。这些年,我们也接触了大量的用户,遇到了大量的数据库坑,其中大部分都与SQL引擎有关。所以今天代表广大用户,对国产数据库在SQL引擎上提出一些功能需求。希望在国产数据库的新版本中,我们可以看到这些功能已经逐步实现。如果说国产数据库SQL引擎最想要的功能是全功能的HASHJOIN,那大家都知道HASHJOIN是解决大数据表关联问题最有效的连接方式。Oracle的HASHJOIN非常强大,大量复杂的连接条件都可以通过HASHJOIN解决。虽然现在很多开源和国产的数据库都支持HASHJOIN,但是在HASHJOIN的支持上还存在很多盲区。如果在某些情况下,碰巧不能使用HASHJOIN,那么就只有一种方法重写这条SQL,这对开发人员和DBA来说都是灾难。第二个需求是SQL指纹和执行计划指纹。SQL指纹和SQLID不完全是一回事。SQLID只能指向唯一的一条SQL语句,而SQL指纹可以将一组略有不同的SQL语句归为一条SQL。例如,如果我们有一条SQL,除了某些情况外都是相同的,或者只有一个变量不同而其他的都相同,那么这些不同的SQL应该是同一条SQL,尽管这些SQL的SQLID可能不同,但是,这些SQL具有相同的指纹信息。通过这些指纹,可以找到相同的SQL,进行统一分析。执行计划指纹指的是完全相同的执行计划。具有不同SQLID的SQL可能会使用相同的执行计划。SQL中会有一个执行计划指纹标识,指向这个执行计划。通过“执行计划指纹”,我们可以减少内存中存储的执行计划数量。无论是否执行全局执行计划,都可以将执行计划存储在共享内存区,供监控分析人员使用。类似SQL指纹和执行计划指纹的功能其实大部分Oracle数据库都已经实现了,有兴趣的朋友可以研究一下。第三个要求是提示。改进优化器非常困难。它需要大量的资金投入和时间才能让它变得越来越好。靠几个聪明的专家是办不到的。如果CBO优化器确实无法做出正确的判断而必须使用错误的执行计划,开发者仍然可以使用HINT来强制修正执行计划。目前国内部分数据库和开源数据库都支持hint。但是在实现方式上,国内和开源的数据库很多都是通过数据库代码中的插件和hook来实现的。另外,HINT支持的操作也不是很完整。通过hooks实现的插件还是比原来的内核支持效率更高。在内核中直接支持丰富的HINT,绝对是国产数据库提高SQL分析效率的必然途径。在HINT支持的操作方面,HINT不仅可以强制执行一定的执行计划,还可以在集群计算环境下实现强读写分离、弱读写分离等功能。比如在集群计算环境中设置MASTER选择的策略,指定某个操作可以放在只读节点上,甚至指定某个操作是弱一致性操作,运行数据延迟的最大限制等等,这些HINT往往要求将集群计算环境并入数据库的内核,而不仅仅是插件。第四个要求是OUTLINES的原生态支持。当我们不能直接修改SQL,加上HINT来强制执行更优化的执行计划时,就只能依靠OUTLINES了。传统的OUTLINES只能针对某个SQLID。如果有一些不使用绑定变量的情况,是没有办法通过SQLID来指定OUTLINES的。往往在一个系统中,这些SQL是最常用的,也是最重要的。在OUTLINES的实现中,如果可以通过SQL指纹来设置,那么OUTLINES的用途将会更加广泛。第五个需求是长时间运行的SQL执行进度可视化,提供类似OracleV$SESSION_LONGOPS的外部接口视图。但我希望能提供比Oracle更多的信息。比如当前的操作来自哪个执行计划(执行计划指纹),这个操作在执行计划的哪一步。当然,这个SQL执行进度的可视化只展示了长期的执行操作。只有当执行计划中某个算子的执行代价超过一定阈值时,才需要输出到接口。否则,这个输出会影响SQL引擎的效率。.这部分功能只需要在某个operator级别实现即可,没有必要在SQL级别实现。SQL引擎的性能还是优先的,可视化是次要的。事实上,SQL引擎中的优化器是最难改进的部分,需要大量的应用案例来推动其优化和改进。而且,有些优化器的功能优化难度极高,一个优秀的CBO优化器也不是一朝一夕就能做出来的。但在优化器达到完美之前,它必须是足够的。也就是我们可以尽量避免让我们的开发人员一直面临SQL不重写就不能正常运行的窘境。用户的应用场景非常复杂,所以作为国内的数据库开发者,应该集中精力解决必须解决的问题,用HINT和OUTLINES来弥补优化器解决遗留问题能力的不足。必要的。不管怎样,解决用户问题的数据库才是好的数据库。