2

你的数据库为什么这么慢?

 2 years ago
source link: https://my.oschina.net/u/3955268/blog/5189606
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

你的数据库为什么这么慢? - 偶数科技的个人空间 - OSCHINA - 中文开源技术交流社区

当你发现数据库查询特别慢的时候,并且从硬件配置、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(single instruction multi-data), 即单指令多数据流,以同步的方式在同一时间内执行同一条指令。相比单指令单数据流(SISD),单指令多数据流一次性获得所有操作数进而加快了运算,特别是数据密集型运算。

如上图所示,使用标量运算一次只能执行一对数据的乘法操作,而采用SIMD乘法指令则可以一次同时执行四对数据的乘法操作。作为向量体系结构的一种,SIMD使用一条向量指令开启一组数据操作,其中数据的加载、存储以及数据计算以流水线的形式进行。

通过在国际标准数据集TPCH上的测试,我们发现OushuDB 4.x的速度比最新版本的SparkSQL 3.x快大约一个数量级。

基于以上的分析,如果从提升数据库性能的角度,我们可以采用基于代价的优化+向量计算+ SIMD的技术路径,作为提升数据库性能的首选方法。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK