我们计划实施一个系统,将高频率的市场价格记录到数据库中进行进一步分析.为了简单地了解我们可以在不同的数据库解决方案上获得什么样的存储性能,我创建了一个用于插入基本行标记信息的小应用程序.在几个不同的DB上运行相同的代码时,我们得到了一些有趣的结果.
插入的数据非常简单如下:
CREATE TABLE [dbo].[price]( [product_code] [char](15) NULL, [market_code] [char](10) NULL, [currency] [nchar](6) NULL, [timestamp] [datetime] NULL, [value] [float] NULL, [price_type] [char](4) NULL ) ON [PRIMARY]
Microsoft SQL Server:
总测试时间:32秒.每秒3,099个价格.
MySQL服务器:
总测试时间:18秒.每秒5,349个价格.
MongoDB服务器:
总测试时间:3秒.每秒25,555个价格.
此测试的目的只是为了获得底部系统可以预期的"原始性能"的一些指示.当实际实施解决方案时,我们当然会做缓冲,批量插入等.
我们只关心插入的速度,因为查询是在以后"离线"完成的.
有没有人对其他适合的数据库有任何建议?今晚我也会尝试使用HDF5和MonetDB.它需要具有多客户端访问权限.
谢谢你的任何建议!
更新 :
抱歉,我在定位前对我的问题进行了重大编辑,似乎我遗漏了服务器版本和硬件的一些细节.所有测试都在8核服务器上运行Windows 2008 x64,内存为12GB.
Microsoft SQL Server 2008 Enterprise x64.MySQL 5.1.44作为InnoDB表运行.MongoDB 1.2.4 x64
当前测试是一个简单的行插入DB的循环,其中纳斯达克的真实历史数据已编译成已导入内存的CSV文件.代码在C#NET4 x64中.
MS SQL和MySQL服务器被"调整"到完美设置,而MongoDB只是设置了默认设置.SQL表的设置没有索引,因为在转移到主分析系统之前,DB的目的很简单,因为它是一个临时基础.
许多建议使用批量插入,但这是一种难以实现的方式,因为我们有几个客户端独立于实时流将单个刻度线推入数据库.为了允许这样的方法,我们必须将数据库前面的层扩展到我们现在有机会测试的范围之外.但是我想象最终架构必须要做的事情,因为我们从除MongoDB之外的所有东西获得的数字不足以处理所需的输入数量.
更新2:SSD驱动器确实非常适用于此,我们自己也在使用它.然而,最终产品将安装在几个不同的客户,这些客户都提供自己的铁..而从IT部门获取SSD的服务器仍然很难...... :(
更新3:
我尝试了BulkCopy方法.与其他循环相同的循环的性能,但首先进入DataTable然后BulkInsert进入SQL Server导致以下结果:
Microsoft SQL Server(批量):
总测试时间:2秒.每秒39401个价格.
我只能对sql-server发表评论,但有些事情要尝试:
命令批处理(即INSERT
在单击中对数据库执行多次)
批量插入(通过SqlBulkCopy
)
要么应该对单行插入进行重大改进(后者最快)