热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DolphinDB与AliyunHybridDBforPostgreSQL在金融数据集上的比较

1.概述DolphinDB是一款高性能混合列式数据库和数据分析系统,尤其擅长处理时间序列数据。AliyunHybridDBforPostgreSQL(以下简称HybridDB)是


1. 概述





DolphinDB是一款高性能混合列式数据库和数据分析系统,尤其擅长处理时间序列数据。Aliyun HybridDB for PostgreSQL(以下简称HybridDB)是由阿里巴巴提供的基于开源Greenplum定制的MPP架构企业级通用数据仓库产品。





在本报告中,我们对DolphinDB和HybridDB,在时间序列数据集上进行了性能对比测试。测试涵盖了CSV文件的加载、单个查询的执行、并发查询的执行等三方面。在我们进行的所有测试中,DolphinDB均表现得更出色,主要结论如下:






  • 在加载数据的测试中,DolphinDB的速度是HybridDB的3倍


  • 在查询的测试中,DolphinDB的速度领先HybridDB约1~2个数量级


  • 在并发查询的测试中,DolphinDB仍然保持1个数量级以上的优势,而且随着并发用户的增加,优势更加明显。






本测试仅限于时间序列数据,结论不适用于更为通用的数据领域。





2. 测试环境





DolphinDB部署在5个ecs.r5.large节点上,每个节点基本配置如下:






  • 操作系统:Ubuntu 16.04


  • 处理器:Intel Xeon Platinum 8163 (2 Cores)


  • 内存:16 GB


  • 硬盘:150 GB SSD






HybridDB采用2C SSD配置,拥有4个计算节点,每个节点基本配置如下:






  • 处理器:2 Cores


  • 内存:16 GB


  • 硬盘:160 GB SSD






DolphinDB采用1个主节点,4个计算节点,配置8个worker和2个local executor,每个计算节点限制使用12 GB内存。





HybridDB直接使用,不做任何进一步的配置,每个计算节点2个段数据库。经过测试开启Pivotal Query Optimizer时HybridDB表现更差,因此本报告中所有测试都默认只使用Legacy Query Optimizer。





压缩为gzip的CSV数据存放在阿里云OSS服务器上。DolphinDB通过内网获得OSS上的数据后解压并加载,HybridDB直接通过oss协议定义外部表从内网传输、解压并加载OSS上的数据。





3. 数据





我们使用的数据是2007年8月的股票报价数据,大约有65.6亿条记录,每天的数据保存在一个CSV文件中。未压缩的CSV文件有273 GB,压缩为gzip的文件有23 GB。压缩后的数据被上传到阿里云OSS上。





4. 数据加载对比





表4.1是DolphinDB和HybridDB加载CSV文件时各变量数据类型,分区方案如下:






  • DolphinDB使用date和symbol进行组合分区。根据date产生了23个值分区,根据symbol产生了128个范围分区。分区总数是23*128=2944个。每个分区写入两个副本。


  • HybridDB根据symbol散列分布数据,根据date按日期范围分区,在压缩的情况下对symbol施加sort key有不到10%的性能下降,在不压缩的情况下对symbol施加sort key有不到10%的性能上升,随后的测试中都没有使用sort key。






两个平台的数据加载对比结果如表4.2所示,由于DolphinDB和HybridDB都从OSS上获取压缩数据,因此可以认为HybridDB的数据传输和解压时间与DolphinDB基本一致,则HybridDB的数据载入时间可以认为是90-9-12=69分钟。DolphinDB的数据载入速度约为HybridDB的3倍。





表4.1 数据类型对应关系









表4.2 数据处理并载入对比









DolphinDB采用LZ4格式的压缩,HybridDB基于开源Greenplum,不支持QuickLZ格式,因此采用了ZLIB的3级压缩。压缩后的磁盘空间(28G)占用少于DolphinDB(51G)。上表中DolphinDB的空间占用达到了102G是因为有两个副本。





5. 查询性能对比





我们在两个系统中分别测试了8种查询。这些查询涉及数据过滤、排序、分组和聚合,由于DolphinDB与HybridDB的语法有差异,具体查询语句见表5.1。





每条查询需要扫描不同范围的数据,下述8条测试查询覆盖了局部扫描到全表扫描。遗憾的是在HybridDB中对第7条查询支持较差,在系统压力大的情况下会出现内部错误(Unexpected Internal Error),因此在HybridDB的测试中将除去第7条查询。





单个复杂查询的对比结果如表5.2所示,每条查询的测试连续进行2次,表中列出第1次的结果,DolphinDB比HybridDB快3~240倍,并且在缓存的支持下,第1至3条查询缓存后进行的第2次测试用时分别为26ms,16ms和16ms。





从结果中可以看出,第1、3和6条查询是DolphinDB显著领先的,这些查询在where分句中均指定了明确的symbol。回顾两个系统的分区策略,由于HybridDB不支持字符串类型的范围分区,因此涉及到不同的symbol的查询就会因为分区不够灵活而导致部分节点实际扫描的数据远多于目标数据而性能劣化。





表5.1 具体执行的查询语句









表5.2 单独执行每个查询的用时对比









6. 并发性能对比





6.1 多用户并发简单查询





在本节,我们将进行多用户并发查询测试对比。结果表明,即使在多用户并发查询的情况下,DolphinDB仍然比HybridDB更具优势。





我们首先进行简单的select查询并发测试。步骤如下:





(1)我们从2007年8月的股票数据中选择了记录最多的100只股票。这100只股票的记录占了总记录的20%。





(2)建立n(1~32)个数据库连接。每个数据库连接都是并发用户。在每个数据连接中,先从步骤1得到的100只股票中随机选取10只(如AMZN),然后在2007年8月中随机选择一个交易日(如2007年8月21日)来生成简单查询。例如:





select * from quotes where date = 2007.08.21 and symbol=“AMZN”





通过n(1~32)个数据库连接,把步骤2生成的10个查询的批处理请求同时发送给数据库。





(3)每个并发用户数量的测试都执行三次,并取平均用时作为结果。





HybridDB集群每个计算节点提供了2个CPU核心,从结果中可以看出,HybridDB在并发用户数每增加2个时,消耗时间显著增加,这是因为HybridDB底层由PostgreSQL实例构成,每条查询只会用到1个CPU核心,当只有奇数个并发用户时另一个核心会处于空闲状态而不会被充分利用起来,导致了资源的浪费。同时HybridDB的MPP架构会将数据分散到各个节点,最后只有拥有相关数据的节点会执行查询,另外的节点会闲置。回顾第5节中的结论,由于简单select查询均涉及symbol,因此HybridDB也会有较大性能瓶颈。





表6.1 多用户并发简单查询用时对比









6.2 多用户并发复杂查询





在多用户并发简单查询的基础上,我们还测试了前述的7个复杂查询(8个复杂查询除去无法在HybridDB上使用的第7条)的并发性能。单用户执行7个查询的耗时,与7个查询单独测试时的耗时累加相接近,符合预期。随着并发用户的增加,DolphinDB对HybridDB的优势同样不断扩大,与并发简单查询的结果吻合。





可以预见,随着并发数量的持续增加,DolphinDB对HybridDB的优势则会不断扩大。





表6.2 多用户并发复杂查询用时对比









7. DolphinDB的性能优势分析





DolphinDB对于HybridDB的性能优势来源于多个方面,包括内存管理优化、对字符串处理的优化、算法上的优化等等,但最主要的优势来源于DolphinDB基于分布式文件系统的架构设计。





基于Greenplum的HybridDB集群是由一个主节点(master node)和多个承载PostgreSQL实例的计算节点 (segment host node) 组成,采用传统的大规模并行处理(MPP)架构。这种结构设计上十分简洁。写入数据时,主节点确定数据分发方式,随后每个节点并发写入,并将不属于自己的数据传输给其他节点。查询时,主节点会把查询经过优化器处理后分配给计算节点。简单地说,HybridDB在数据存储和计算查询时采用树状结构;而DolphinDB采用更为扁平的网状结构,每个节点不分主次。采用树状结构,容易出现数据分布的不均衡,或者在用户不饱和或查询的数据只存在于部分节点时反而会出现明显的资源闲置和系统瓶颈。





在分区上,HybridDB支持范围分区、值分区和组合分区,但是范围分区只支持数值或时间类型,灵活性不如DolphinDB。DolphinDB支持值分区、范围分区、散列分区和列表分区等多种分区方案,并且每个表可以根据多个字段进行组合分区,同时范围分区支持字符串等非数值类型。在分区数量上,DolphinDB中的单表支持百万级以上的分区数,分区粒度更细,不易出现数据或查询集中到某几个节点的状况。在执行基于多个列的范围查询或者点查询时,DolphinDB需要扫描的数据块非常少,查询的响应时间更短,并发性更出色。







推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
author-avatar
手机用户248覀9795477
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有