摘要 :性能调优是利用迁徙或开发过程中的关键步骤,同时也在整个我的项目施行过程中占据很大的份量,本篇次要介绍数据库级别的性能调优思路和总体策略。
性能调优是利用迁徙或开发过程中的关键步骤,同时也在整个我的项目施行过程中占据很大的份量,在很多施行步骤中都须要进行思考,从开始的数据建模,表定义的设计,到数据库硬件、集群部署的抉择,再到数据库系统级调优、数据表结构设计,以及单个 SQL 语句的编写及调优,都要思考对性能的影响。
同时,性能调优通常没有明确的衡量标准,没有明确的对错之分,通常须要的隐式技能比拟多,使得其的技术含金量得以晋升。通常来看,要做到一个性能调优的高手,除了对于应用程序的逻辑做到熟能生巧外,还须要对利用的数据库的根本实现原理有所理解,更甚者,还须要对操作系统、网络等基础知识有所涉猎,同时还要具备性能诊断和剖析技巧。当然,性能调优是一个一直积攒的过程,大家不必思考一步到位,唯有进行实际的积攒,能力在广大的调优战场所向无敌。
本篇博文作为《GaussDB(DWS) 性能调优系列》的专题文章,次要介绍数据库级别的性能调优思路和总体策略,包含零碎级和语句级调优。同时,《GaussDB(DWS) 性能调优系列》文章分为根底篇和实战篇,各位读者在通过根底篇文章理解数据库的基本原理后,能够联合调优思路,对实战篇的各个调优技巧进行深刻的学习。无关整个调优过程中的其它方面,后续论坛会推出其它博文进行介绍。
1. GaussDB DWS 执行架构及阐明
GaussDB DWS 是典型的 share-nothing 架构,其计算组件的示意图如上图所示,次要由 CN(Coordinator)和 DN(DataNode)组成。CN 是整个集群的协调者,是整个集群与利用进行连贯解决的门户,用于接管客户的 SQL 语句并返回执行后果。DN 是集群进行数据计算的主体,各个 DN 领有独立的存储和计算资源,使得各个 DN 能够独立地进行计算。GaussDB DWS 反对多 CN 架构,通常应用程序会通过 LVS(负载平衡设施)将语句平均散发到各个 CN 上,以缩小单个 CN 的瓶颈作用。
GaussDB DWS 的 SQL 解决流程如上方右图所示,其蕴含以下几个次要步骤:(1)CN 通过驱动或客户端接管到一条 SQL 后,会进行解析、优化,并最终返回执行后果;(2)CN 进行优化后,生成相应的执行打算;(3)CN 将雷同的执行打算下发到各个 DN 进行执行;(4)如果 DN 之间须要进行数据交换,则执行打算中蕴含流操作算子 Stream,DN 之间同步通过 Stream 算子进行数据交换,共同完成打算的执行并向 CN 返回后果。同时,GaussDB DWS 对于不须要 DN 间数据交换的语句,还反对语句下发到 DN 生成打算;对于局部不反对分布式查问的语句,生成不能下推的打算(此打算对于大数据量性能较差)。各种打算的比照可详见博文《GaussDB(DWS) 性能调优系列根底篇三:衍化至繁之分布式打算详解》。本文后续的探讨均基于 Stream 打算。
2. 整体调优思路
通过后面对 SQL 语句执行流程的介绍,咱们能够晓得,性能瓶颈可能产生在 CN 端、DN 端,以及后果集返回,驱动数据处理等环节,性能调优的第一步就是定位瓶颈点次要产生在哪个环节。因为 GaussDB DWS 大数据量解决时,大部分执行工夫耗费在 DN 端,故本博文次要针对 DN 端语句执行进行总体调优思路的分享。
谈到执行性能,其实从数据模型建模、集群部署、表结构设计,到最终的 SQL 语句优化,都与之严密相干,如上图所示,咱们应用金字塔来形容整个调优过程。越靠近塔尖,其对于整个业务性的影响范畴越广,须要调优时,调优老本也越高,所以在设计之初须要投入足够精力,从上至下,咱们须要全面的设计,能力缩小在最终 SQL 调优时返工的可能。
整个调优过程其实是一个一直迭代的过程,如上图所示。即便设计再紧密,也有可能呈现 SQL 语句性能的优化须要导致数据建模更改、集群部署、表散布键调整的状况,这时一动员全身将引起较高的老本,同时会对其它曾经调优结束的 SQL 产生影响,导致从新调优,老本较高。
咱们对立将前三阶段归结为动态调优,将 SQL 语句级调优归结为执行态调优。上面重点来探讨执行态调优 -SQL 语句调优,从调优步骤来看能够分为性能瓶颈诊断、性能起因剖析和调优项施行,从调优施行对象来看,可能包含后面提到的数据建模、集群部署、表结构设计方面的批改,SQL 语句层调优能够分为零碎级调优和语句级调优。当然,有一些调优项,例如零碎调优项,能够作为教训固化下来,在集群部署的时候就一并设置好,缩小这方面调优破费的老本。同时,SQL 调优也是一个迭代的过程,在施行一次调优项后,须要持续从新进行调优剖析,直至性能达到规范为止。前面的章节,将围绕调优步骤和 SQL 层的调优项来发展。
3. 性能瓶颈诊断
GaussDB DWS 提供了丰盛的打算信息显示工具 Explain,以及动静执行信息剖析工具 Top SQL。
Explain 工具次要针对单个语句进行展现,能够应用 explain 命令显示 CN 生成的 SQL 语句的打算,也能够应用 explain analyze/performance 命令显示执行态信息。通过执行态信息,咱们能够剖析出算子为单位的性能,也能够剖析出算子外部各步骤的性能,进一步为诊断性能的瓶颈打下了根底。Explain 工具相干内容请参考博文《GaussDB(DWS) 性能调优系列根底篇二:大道至简 explain 打算信息》。
Top SQL 工具则针对集群中运行的语句进行整体性能剖析,其蕴含 12 个视图,能够将执行工夫超过肯定设置阈值的语句的执行状态、执行后果进行实时查问,同时能够设置将其转储用作后续剖析。附加于该工具之上的 SQL 自诊断调优工具,则通过瓶颈点的剖析,给出可能的性能起因剖析。同时,咱们还提供 Unique SQL 工具,进行一类 SQL 的性能继续跟踪,能够用于发现系统资源及硬件问题对 SQL 性能产生的影响。Top SQL 工具相干内容请参考博文《GaussDB(DWS) 性能调优系列实战篇二:十八般武艺之坏滋味 SQL 辨认》。
4. 性能起因剖析
性能起因剖析属于性能调优里的高阶常识了,通常要对数据库的执行实现原理有根本理解才可能逐渐深刻上来。本章节将深入浅出地介绍数据库执行实现原理的根本技术,帮忙各位读者敌人可能有趣味去被动查找性能产生的起因,从而本人找到性能调优的办法。
后面曾经对 GaussDB DWS 的执行流程进行了介绍,由 CN 生成执行打算下发到 DN 去执行。GaussDB DWS 是基于代价来生成打算的,因而须要根据基表的统计信息,进行每一步后果集统计信息的估算,依据数据规模的场景从 GaussDB DWS 反对的备选算子中抉择最优的算子组合成打算进行执行。因而,统计信息是打算精确的前提,在执行 SQL 语句前要确保收集最新的统计信息,无关统计信息的收集能够参见博文《GaussDB(DWS) 性能调优系列根底篇一:万物之始 analyze 统计信息》。
因为统计信息只蕴含基表的统计信息,表关联之后的统计信息只能通过估算失去,因而依然可能存在估算不准的状况。GaussDB DWS 针对不同的 SQL 语句中的操作,为每个操作外部实现了不同的算子。每个算子可能在局部场景下是占优的,但其它场景比拟差。SQL 优化时,依据具体的场景去主动匹配最优的算子。如果存在估算不准,将导致算子抉择呈现失误,从而打算较差,此时就须要依据打算的瓶颈来剖析具体的起因了。
通常状况下,GaussDB 解决的操作类型次要分为:扫描算子(Scan)、关联算子(Join)、汇集算子(Agg)和网络传输算子(Stream)。下表列出了各算子类别的应用场景,以及各类别中可选的算子,及其适用范围,同时列出调优场景,供大家参考。
(1)扫描算子(Scan): 次要用于解决从存储扫描数据,返回下层算子,包含:全表扫描算子、索引扫描算子,其中行列存均对应不同的全套扫描算子,索引扫描包含:IndexScan(一般索引扫描)、IndexOnlyScan(仅扫描索引即可取得后果)、BitmapScan(须要索引扫描获取位图后再到基表上扫描),BitmapScanAnd/Or(从多个索引扫描进行位图运算后再到基表上扫描),因为索引扫描的原理根本都雷同,故一并探讨。
(2)关联算子(Join): 次要用于处理表的关联操作。在数据库中,多表关联时,SQL 优化会抉择关联程序进行两两关联。表关联时能够蕴含关联操作,也能够没有关联操作(笛卡尔积)。在 GaussDB DWS 中,次要蕴含 NestLoop, HashJoin, MergeJoin 三种关联算子。
(3)汇集算子(Agg):
(4)网络传输算子(Stream):
(5)其它算子: 同时 GaussDB DWS 还反对排序(Sort)、汇合(SetOp)、物化(Materialize)、窗口汇集(WindowAgg)和输入限度(Limit)算子,因为调优根本不波及,故此处略过。
5. 调优项施行
在晓得导致性能问题的起因后,就能够制订调优项并开始施行了。后面曾经提到,调优项施行的范畴很广。本博文仅探讨数据库级的调优项,包含零碎级调优和语句级调优两局部。
a) 零碎级调优项
零碎级调优又细分为操作系统参数调优和数据库全局参数调优,通常波及到的是零碎 CPU、IO、内存、网络资源的充沛应用,防止资源抵触,晋升整个零碎查问的吞吐量。
因为数据库是运行在操作系统之上的,因而操作系统资源的利用率对于数据库性能的晋升起到基石的作用。对于操作系统参数的调优,次要集中在操作系统内存参数、IO 参数以及网络参数的设置上,具体可参见 GaussDB DWS 产品文档。
数据库级别的调优,次要也是集中在上述资源的应用上,在上述四维度有以下次要因素的思考(具体设置办法能够参见 GaussDB DWS 产品文档):
b) 语句级调优项
语句级调优通常须要通过打算剖析,找到性能瓶颈点,而后依据瓶颈点对应的扫描、关联、汇集、Stream 等算子,剖析是否属于算子实用场景,是否合乎调优条件。如果是,咱们有以下调优伎俩:
i. 通过批改表定义,包含行列存、表的散布形式,达到缩小 IO 和网络资源开销的目标,详见博文《GaussDB(DWS) 性能调优系列实战篇三:十八般武艺之好滋味表定义》。
ii. 如果最终剖析是因为估算不准导致,能够通过相干 GUC 参数调整来设置不同的后果集估算模型,或禁止生成某种类型的算子,通过改良估算值达到优化打算的目标,详见博文《GaussDB(DWS) 性能调优系列实战篇五:十八般武艺之门路干涉》。
iii. 如果在迁徙或降级过程中呈现打算劣化,也能够通过 Plan Hint 的调优形式干涉优化器生成现实的打算,详见博文《GaussDB(DWS) 性能调优系列实战篇六:十八般武艺 Plan hint 使用》。
iv. 对于上述调优伎俩都无奈解决的问题,例如:下推问题,相干子查问晋升,NOT IN 等问题,或者 SQL 语句存在计算冗余等问题,须要依据瓶颈点抉择灵便多变的 SQL 改写策略打消瓶颈点,具体可参见博文《GaussDB(DWS) 性能调优系列实战篇四:十八般武艺之 SQL 改写》
总的来说,性能调优是一项艰巨的工程,当然深刻其中,学习到的常识以及取得的播种都是十分大的。后续论坛也会推出更多的博文对性能调优的方方面面进行介绍,帮忙各位读者迅速积攒调优的教训。
点击关注,第一工夫理解华为云陈腐技术~