当你发现数据库查问特地慢的时候,并且从硬件配置、SQL 优化和索引等方面都找不出起因,那你可能须要从数据库的计算引擎自身的性能找下起因。
数据库的计算引擎性能有多重要?咱们能够拿汽车做个简略类比。服务器硬件配置是基础设施,相当于汽车行驶的路线,高速公路和山村土路的行驶成果必定是不一样的;SQL 的查问优化相当于驾驶程度;而数据库计算引擎就相当于汽车发动机,既是数据库性能的源能源,也是各家厂商最外围的技术壁垒。
那么,咱们就从数据库计算引擎的实现技术探索下如何进步数据库性能。下图是从客户端收回一条 SQL 语句到后果返回给客户端的简化流程。
如果把数据库内核看成一个组织,那么优化器就位于组织的最上层,作为组织的首脑发号施令;执行器位于组织的两头,严格执行优化器下发的打算,从存储空间中读取数据进行加工解决,最终返回给客户端。
优化器
如何形象的了解优化器?以查问“知乎点赞过万的答复”为例,用户通过 SQL 通知数据库“给我找出点赞过万的答复”,优化器把用户的需要转换为“如何找到点赞过万的答复”的策略和办法,即查问打算。
同一种 SQL 会有成千上万种不同的执行打算,而好的执行打算和差的执行打算在运行性能上会有天壤之别。
如何从成千上万种查问打算中选出最优的?晚期数据库的查问优化器通常采纳启发式规定进行优化 RBP(Rule Based Optimization),这种优化形式不够精确,往往难以获得最优的执行打算,而基于代价的优化 CBO (Cost Based Optimization) 则可能针对大多数场景高效筛选出性能最好的执行打算。
因而,咱们见到的高性能数据库引擎往往应用基于代价的优化器。
执行器
执行器是数据库内核最重要的部件之一。晋升执行器的性能,会很大水平上晋升数据库性能,因而各大数据库厂商都纷纷投入很多精力到执行器技术的研发中。
晋升执行器性能的伎俩次要有两种技术路线,一种是向量计算(vectorized execution),另外一种是代码生成(code generation)。目前支流的数据库厂商会应用其中一种执行器优化技术,例如 Snowflake 应用的是向量计算,Impala 应用的是代码生成, Spark 两种都有应用,OushuDB 应用了向量计算外加 SIMD 优化技术。而一些传统的数据库还未实现其中任何一种性能技术。
聪慧的你可能要问了,哪种技术路线更胜一筹?对于这个问题,不少钻研和论文给出了答案:两种技术侧重点不同但都能够晋升性能,不同的语句也会有不同水平的性能晋升,向量计算更适宜并行处理数据 SIMD。所以,想要在并行计算的根底上进一步晋升数据库引擎性能,就能够联合并行处理数据充分利用 CPU 硬件指令(比方 SIMD)。
SIMD
SIMD(single instruction multi-data), 即单指令多数据流,以同步的形式在同一时间内执行同一条指令。相比单指令单数据流(SISD),单指令多数据流一次性取得所有操作数进而放慢了运算,特地是数据密集型运算。
如上图所示,应用标量运算一次只能执行一对数据的乘法操作,而采纳 SIMD 乘法指令则能够一次同时执行四对数据的乘法操作。作为向量体系结构的一种,SIMD 应用一条向量指令开启一组数据操作,其中数据的加载、存储以及数据计算以流水线的模式进行。
通过在国际标准数据集 TPCH 上的测试,咱们发现 OushuDB 4.x 的速度比最新版本的 SparkSQL 3.x 快大概一个数量级。
基于以上的剖析,如果从晋升数据库性能的角度,咱们能够采纳基于代价的优化 + 向量计算 + SIMD 的技术门路,作为晋升数据库性能的首选办法。