一、前言

         OceanBase和TiDB作为国内2款的比拟风行的兼容MySQL协定的开源数据库使用者也越来越多,两种数据库不仅在架构原理上有较大差别,在开源形式上有较大的不同:

         TiDB 采纳的Apache License 2.0开源协定,其第一行代码提交就是在github上,和企业版相比社区版只是不蕴含拜访白名单和审计2个插件性能,其余与企业版完全相同且同步发版(之前闭源的tiflash也于2022.4.1齐全开源)。

         OceanBase社区版采纳国内的木兰公共协定 MulanPubL-2.0开源,官网划分成社区版、云服务版、企业版三种类型,开源的社区版与企业版相比存在较多功能缺失或性能升高(如目前比照版本不反对oracle兼容、不反对闪回、不反对analyze语句、ocp不反对备份性能等),且社区版本版公布与企业版不同步。另外ob的文档和资源相比拟tidb还不够欠缺和丰盛。

       本文针对tidb、oceanbase在执行打算的相干内容进行浅显的比照,也对学习做个总结,比照版本为OceanBase3.1.2-CE(2022-03-29发版 )、TiDB v5.2.3(2021-12-31发版)

二、查看执行打算

  •  TiDB:

(1)    explain SQL形式:该形式只是展现可能的执行打算并非理论的执行打算,目前各数据库都存在此问题应用explain形式并不是真正SQL执行时的打算,多数状况下会存在不统一。

(2)    explain analyze形式:该形式会真正执行SQL并展现执行时的执行打算,执行打算中减少理论的执行信息包含理论返回行数、各算子工夫和调用及资源耗费等。

(3)    select tidb\_decode\_plan()形式: tidb的慢SQL日志里会以hash值形式记录慢SQL的执行打算,而后应用tidb\_decode\_plan()函数即可解析。

(4)    dashboard查看:tidb的PD组件蕴含dashboard性能,慢SQL、SQL统计页面能够查看每个SQL的执行打算

  • OceanBase:

(1)    explain SQL形式:蕴含BASIC、OUTLINE、EXTENDED、EXTENDED\_NOADDR、PARTITIONS、FORMAT = {TRADITIONAL| JSON}多个展现选项,除了extended形式大部分状况展现的内容基本一致,extended形式时会减少hint、outline、plan type、optimizerinfo等信息。

(2)    应用零碎视图形式:oceanbase在实现上始终致力不便oracle dba应用,通过v$plan\_cache\_plan\_explain/ v$plan\_cache\_plan\_stat等视图能够查看执行打算及算子的执信息(如行数、工夫等),相似oracle的v$sql、v$sql\_plan等视图

(3)    因未部署ob 图形化治理平台ocp,因而未看SQL执行打算的页面展现。

三、执行打算内容

  • TiDB:

         TiDB的执行打算展现与oracle相似,以缩进的形式展现算子间的档次关系,同时应用折线进行算子连贯展现,当SQL简单执行步骤较多时能够很显著看出处于同一缩进深度的算子,explian形式下执行打算包含算子信息(id列)、预估行数(estRows列),拜访对象(access object列)、过滤条件和操作信息(operator info列)

         应用explain analyze或查看慢SQL中记录的执行打算时还包含每个算子理论的返回行数(actRows列)、算子的执行工夫和散布统计(execution info列)、内存占用(memory)、磁盘读(dsik)

execution info列展现的内容如下:

tikv\_task:{proc max:640ms, min:120ms, p80:260ms, p95:470ms, iters:4859, tasks:27}, scan\_detail: {total\_process\_keys: 4861956, total\_keys: 4861983, rocksdb: {delete\_skipped\_count: 420892, key\_skipped\_count: 4861956, block: {cache\_hit\_count: 202, read\_count: 18548, read\_byte: 493.0 MB}}}

         execution info因为是和每个算子展现成一行,且信息较多输入时较多换行,对执行打算浏览有些影响,如果能放到上面进行额定展现的话,就能使执行打算步骤展现看起来更不便些。

  • OceanBase:

         Oceanbase将执行打算划分为了本地执行打算、近程执行打算、分布式执行打算。执行打算展现十分靠近oracle的展现形式,explain basic下展现执行打算和output\&filter。 树形执行打算中包含算子展现id、算子内容(OPERATOR列)、拜访的对象信息(NAME列)、预估行数(EST. ROWS)、评估的老本(COST)。output\&filter展现的列过滤和投影后列信息,相比oracle展现的内容没有access信息,且列值可读性差。

         在exteneded形式下还包含SQL应用HINT、SQL执行生产的outline(outline局部根本和oracle统一)、优化器的执行信息optimizer info。

         Oceanbase中对于门路拜访的算子较少,目前只有TABLE GET(间接主键定位)、TABLE SCAN(全表或索引扫描回表)、LOOKUP TABLE(全局索引扫描回表),针对执行打算中是否应用索引须要联合name列是否有索引以及filter中is\_index\_back=true判断,对于扫描形式不够间接和不便,比方索引全扫描、索引范畴扫描、是否应用笼罩索引等。对于分区信息的显示ocenbase和oracle一样展现的分区partition id,tidb内展现的是分区名更直观一些。

四、慢SQL记录

  • TiDB:

         超过slow\_launch\_time参数值的SQL会被记录到tidb\_slow\_query.log。可通过information\_schema.CLUSTER\_SLOW\_QUERY或dashboard查看。

  • Oceanbase:

         执行工夫超过trace\_log\_slow\_query\_watermark参数值设置的会记录到observer.log。

         应用视图v$plan\_cache\_plan\_explain/ v$plan\_cache\_plan\_stat也能够按条件过滤慢SQL,不过查问时如果没有指定ip\port\tenant\plan\_id等条件是数据返回空行,即便count(*)整个基表表也是返回空。

         此外还能够通过v$sql\_audit视图查问会话和SQL执行信息,其相似于oracle的v$session视图。

五、HINT

         对于hint应用OceanBase和tidb的形式根本一样,oceanbase中除了惯例的hint外,还能够像oracle一样应用 outline data作为hint内容。

六、执行打算绑定

  • TiDB:

         TiDB执行打算绑定性能叫SPM(sql plan managment)包含手动绑定执行打算、主动捕捉执行打算和演进性能。执行SQL绑定时会将SQL进行标准化进行变量值的替换和空格转换等,在执行SQL时会将SQL进行标准化,与标准化后的SQL进行比对,如果始终则应用绑定的执行打算。TiDB中绑定SQL与原始SQL大小写不统一、空格换行不统一等不影响绑定应用。TiDB内不能应用SQL\_digest/plan\_digest等hash值形式进行SQL绑定,在创立和删除绑定时都必须应用原始SQL和HINT SQL,对于较长的简单SQL不是很不便。

         执行打算绑定详细信息可参考官网文档和专栏文章:https://tidb.io/blog/83b454f1

  • OceanBase:

         Oceanbase的执行打算绑定可应用2种形式,2个从概念上都参考了oracle,一个是应用outline形式进行执行打算绑定,一个是应用SPM形式进行绑定和执行打算捕捉和演进(开源版不反对SPM)。Outline应用形式和tidb创立SQL binding相似都是应用HINT SQL和原始SQL绑定,不过oceanbase的SQL绑定严格要求原始SQL和HINT SQL必须完全一致(相似oracle的sql\_id计算),大小写和空格对绑定有影响。Oceanbase反对应用SQL\_ID、PLAN\_ID的值进行执行打算绑定,不便绑定操作。

         无论TiDB还是OceanBase两个都不反对HINT SQL应用force index类提醒绑定执行打算。

         Oceanbase的SPM执行打算治理和oracle十分相似,都是应用dbms\_spm包进行治理,其语法基本一致,同样通过几个参数管制是否进行主动绑定和演进。

 

七、执行打算缓存

  • TiDB:

         应用Prepare/execute形式,Prepare 时将参数化的 SQL 查问解析成 AST(形象语法树),每次 Execute 时依据保留的 AST 和具体的参数值生成执行打算,对于Prepare的语句在第一次execute时会查看该语句是否能够应用执行打算缓存(比方蕴含分区表、子查问的语句不能缓存),如果能够则将语句执行打算放入到缓存中,后续的execute会首先查看缓存中是否有执行打算可用,有的话则进行合法性检查,通过后应用缓存的执行打算,否则从新生成执行打算放入到缓存中。

         缓存是session级的,以LRU链表形式治理,链表元素为kv对,key由库名、prepare语句标识、schema版本、SQL\_Mode、timezone组成,value是执行打算。通过prepared-plan-cache下的相干选项能够管制是否启用缓存、缓存条目数和占内存大小。

  • OceanBase:

         Oceanbase内除了能够应用prepare形式外,oceanbase对执行打算缓存参照oracle做了大量工作。和Oracle rac相似每个observer只治理本人节点上的缓存,不同节点雷同SQL缓存的执行打算可能不同。

         Oceanbase将SQL文本进行参数化解决后作为执行打算缓存的键值key,value是执行打算。Oceanbase的SQL匹配也参考了oracle,引入了cursor\_sharing参数和HINT,参数值为excat要求SQL匹配必须齐全一样,包含空格、大小写、字段值等。参数值为force时则以参数化后的SQL进行匹配。

除此之外ocenabase也引入了自适应游标共享ACS性能,针对一个SQL在应用不同字段值时应用不同的执行打算,通过参数可管制是否开启该性能。

         缓存的执行打算可通过通过v$plan\_cache\_plan\_explain/ v$plan\_cache\_plan\_stat查看。

开源版不反对cursor\_sharing和ACS性能。

八、统计信息

  • TiDB:

         tidb统计信息收集包含主动统计信息收集和手动统计信息收集。主动统计信息收集依据表的状况和参数tidb\_auto\_analyze\_start\_time/tidb\_evolve\_plan\_task\_end\_time/ tidb\_auto\_analyze\_ratio决定何时进行统计信息收集。手动统计信息收集依据须要随时执行analyze SQL。

         TiDB反对feedback个性,即在SQL执行时依据理论的执行信息去更新统计信息,以使统计信息依据精确和及时更新,不过因为feedback个性会导致一些问题,改个性默认为敞开。Oracle数据库在11g引入该个性时也引起一些问题,大部分状况DBA会将该性能敞开。

         Tidb内的统计信息能够应用show stats\_meta/stats\_buckets/stats\_histograms等查看。

         对于统计信息收集的更具体收集可参考:https\://tidb.io/blog/92447a59

  • OceanBase:

         Oceanbase社区版不反对analyze语句收集统计信息(商业版3.2才引入),存储层进行合并时更新统计信息,能够手工触发合并操作进行更新。SQL执行时从memtable进行动静采样,采样比例固定,无奈更改。

         相干统计信息可从\_all\_table\_stat,\_\_all\_column\_stat, \_\_all\_histogram\_stat等零碎视图查看。

九、SQL trace

  • TiDB:

         tidb 间接应用trace SQL执行即可展现trace后果。Operation列展现函数调用档次和拜访的region信息,startTS了展现该步的开始工夫,duartion展现该步的耗费工夫。

  • OceanBase:

         OceanBase的trace应用相似和后果相似于mysql的Profiling。执行过程如下:

(1)    开启trace: SET ob\_enable\_trace\_log = 1;

(2)    执行SQL

(3)    Show trace查看,而后SET ob\_enable\_trace\_log =0 敞开

从展现后果上看其信息的直观性和可用性上不如tidb。

 

十、遇到的问题

  • TiDB:

(1)    执行打算中不显示不显示子查问的表信息,无奈判断应用的扫描形式

该问题目前暂未实现修复: https://github.com/pingcap/ti...

         oceanbase执行打算如下:

  • OceanBase:

(1)    对于子查问中不存在的列不会报错依然继续执行

         Tidb执行如下:

(2)    Oceanbase无奈应用索引

         按id列进行小范畴查问时无奈应用id列索引,执行手工合并后依然是全表扫描执行打算。

tidb执行打算:

(3)    不同的index hint形式导致执行打算不同

TIDB执行打算:

 

(4)    explian展现的执行打算不能应用绑定后的Outline ,数据字典内记录的执行打算应用了索引

Tidb执行打算:

(5)    执行Prepare后会导致会话断开,再次执行后胜利,对于交互式客户端oceanbase不反对显示查问后果。

TiDB执行打算:

(6)    Obproxy可能会和多个后端observer建设连贯,导致雷同会话执行的慢SQL会被记录到多个observer的observer.log内(ob内应用数据字典查问慢SQL信息会更好些)。

十一、总结

         集体认为从性能上看oceanbase的执行打算治理要TiDB更丰盛些,如SPM、ACS等,但从理论应用看无论是操作的复杂性、执行打算的可读性、优化器的可靠性都要因为oceanbase。Oceanbase在各方面在致力的向oracle兼容,比方零碎视图、SPM治理、自适应游标共享、期待事件等,因架构不同、教训积攒等和oracle比还是有着不小的差距。

         针对TiDB倡议如下:

(1)    执行打算绑定治理能够应用sql\_digest、plan\_digest等,可防止应用SQL语句

(2)    执行打算缓存做成全局治理形式,防止多个会话对雷同SQL进行缓存,节约内存空间

(3)    Explain analyze的execution info 在执行打算上面独立展现,否则执行打算太长不不便浏览。

作者:@h5n1 公布工夫:2022/4/12
原文链接:https://tidb.net/blog/f1fd1733