我工作中现在有个任务,做一个asp.net站点,向客户提供数据接口,涉及到的数据量比较大,每个月大概1000W条记录,数据库写操作比读操作频繁。
之前做的项目都是用SqlServer,但是我担心用SqlServer的话,几个月下来数据库太大,影响性能。另外如果做分区表的话,不知道是不是能自动根据时间去分区,在网上简单看了些教程分区的点是分区时就要固定的,那样的话就需要数据库人员定期维护,我是想尽量不让用户去定期维护。
对Oracle Berkeley DB和DB4O这些嵌入式数据库稍有了解,网上介绍Oracle Berkeley DB也能存储很大量的数据,DB4O好像相关介绍较少。请用过的高人,帮忙指点一下应该如何选择数据库。
另外,我还考虑是否可以结合使用,用嵌入式数据库每天的记录数据,定时同步到Sqlserver中,不知道这种办法有无必要。
你不能拿 Berkeley DB 同 SQL Server 对比,你应该拿 Oracle 同 SQL Server 对比。
我其实就是看到有的介绍说,写操作多的话嵌入式数据库有优势,才问的。
@于为源: 那你也应该用 Berkeley DB 同 Oracle 比啊!
@Launcher: 是因为用户的机器上装了个SqlServer2008,而且只有一个服务器……,就用SqlServer2008吧,不行了再说。
@于为源: 写入 Sql Server 的操作记得用异步I/O模式,能批量提交的就批量提交,交换机的带宽要足够,磁盘要够快,内存要够大,CPU频率要够高。
@Launcher: 谢谢!我本来是想着先把数据存Berkeley DB或者DB4O里边(就像是个缓存),定时批量取出“缓存”中数据,写入SqlServer2008,并清除“缓存”中相关的数据。但是对Berkeley DB实在不熟悉,又对DB4O不太放心,就怕弄巧成拙,就shi了。
@于为源: 还不如自己创建一个内存映射文件,直接写文件,少了数据库那些中间层,写入更快。
@Launcher: 谢谢您的指导,学到了很多,去恶补了一下内存映射文件。想问一个问题,内存映射文件对并发有法处理吗?因为程序是个asp.net站点,并发访问时难免有多个线程同时访问这个“内存映射文件”的情况,我是需要自己lock一下,还是不用,lock了会造成问题吗?谢谢。
@于为源: 非线程安全,需要你自己根据需求来选择同步方式(有锁或无锁)。比如假设每条记录的大小是一样的或者可以设计成一样,那么通常通过设定一个计数字段,通过 InterlockedIncrement 来计算下一个可用空间的位置,这会比使用其它同步原语更高效。或者可以采用生产者-消费者模式来使用内存映射文件(.NET 中包含使用此模式编写的集合,将存储模式修改为内存映射文件即可)。
@Launcher: (.NET 中包含使用此模式编写的集合,将存储模式修改为内存映射文件即可)您知道相关资料地址吗,我不知道该百度什么关键词,找了半天没找到
@Launcher: 如何“将存储模式修改为内存映射文件即可”呢?
@于为源: 你可以看下 ConcurrentQueue 之类的源码,将其中使用内存数组的代码修改为使用内存映射文件。
@Launcher: 谢谢了,听君一席话,胜读十年书。