1.测试场景
公司有一个应用,用于将客户的资金数据,股东数据插入数据库中。应公司业务量大,故存在大量插入查询等数据库操作。为了测试达梦数据库与Oracle数据库的性能差异,选用了这个场景进行测试。记录完成时间,资金明细插入时间,股东账户插入时间,股东账户更新时间,进行对比分析。
2.测试结果
在进行分析时,以达梦-新和Oracle进行对比。
3.测试数据分析
3.1nmon分析
先看一下oracle和达梦的总体资源消耗
达梦的IO消耗明显高于Oracle,数据的读写总量差异非常大
3.2资金明细插入时间分析
资金明细插入是采用多线程并行插入的。Oracle耗时2:48,达梦耗时13:06。
截图为使用达梦数据库时的系统表现,应用进程占用大量cpu,切kernel使用率非常高,已经不正常,存在调优空间。
3.3股东账户插入时间分析
股东账户插入是单线程插入,Oracle耗时47:22,达梦耗时54:23。
根据3.2的分析,oracle如果提高并发,速度可以得到提升,达梦提高并发,也无法提高性能。
3.4股东账户更新时间分析
股东账户更新是单线程更新,oracle耗时1:03:39,达梦耗时1:30:49。
通过分析Oracle awr,发现上场时股东账户进行了2次更新,建议合并成一次。
3.5数据库使用ODBC接口与OCI接口测试数据分析
在之前POC测试时,专门针对达梦和Oracle的性能做过测试。
目前SQLAPI连接Oracle使用的是OCI接口,连接达梦使用的是ODBC接口,由于ODBC是通用接口,效率明细低于OCI专用接口,所以达梦原厂建议使用达梦原生接口dci连接数据库,但是由于SQLAPI不支持达梦,所以无法使用dci接口。
POC时专门写了测试程序,使用dci接口,128线程并发,插入500万条记录,耗时2分23秒,这个数据和Oracle资金明细插入483万耗时2分48秒是差不多的。
同时也做了使用ODBC接口访问Oracle的性能对比测试,结果是与使用ODBC接口访问达梦性能差不多(数据缺,当时未记录)。
3.6达梦数据库语句分析
在排查过程中发现,select count(*) 语句执行缓慢,本来达梦对这个语句有过特殊的优化,但是在我们的场景中,该语句耗时很大。下图中数据为微秒。
可以通过命令alter table core.md_stk_type without counter来绕过该问题。
4.结论
SQLAPI使用ODBC接口访问达梦数据库,性能下降很多,无法达到与SQLAPI使用OCI接口访问Oracle的性能。
在表插入和更新场景中,达梦的磁盘写入大约是Oracle的15倍。
达梦的高并发插入场景,应用程序在intel服务器有kernel使用率过高的问题,在信创环境未发现。
5.产生问题的根本原因
达梦数据库性能低的根本原因是使用ODBC接口访问数据库,同时程序并发度低。
6.建议
修改SQLAPI访问达梦的接口,改用dci方式。
修改程序,提高并发插入线程数量。
文章
阅读量
获赞