如何在内存缓存中存储巨大的(Oracle)数据集

时间:2014-01-09 07:43:54

标签: java caching memcached in-memory-database hazelcast

描述:我有一个事务表,平均每秒插入约200(+ -100)行,当前系统从中查询基于客户端ID检查数据是否有/无时间(按升序排序)和其他一些条件。该表的分区方式使得该表仅包含当前日期的数据,较早的数据存储在< table_name_date_year>。该查询在此表上运行,以便为客户生成各种详细报告。

最近改进性能的改变,1)获取表的最小值和最大值,2)并行查询每50000条记录上的表(一次只查询5条),运行查询条件<来自>和<到>,直到达到最大值3)生成报告,4)合并报告。

问题:数据库开发人员进行了各种查询调优后,查询运行速度仍然较慢(需要几分钟才能完成)。

内存数据缓存(如memcached或redis(或ehcache?)或“任何其他缓存框架”)是否可用于存储/更新针对client-id存储的数据,以便报告系统从中获取数据缓存并生成报告,而不是直接从thge primary-db查询? (例如:< key,pair>,< client-id,{dataset}>)如果是这样的话?

可以在这里使用像HAZELCAST或Terracotta这样的bigdata实现,或者(我没有对此进行过多探讨)或Apache Gora?如果是这样的话?

可以使用MappedByteBuffer开发基于Java的解决方案,但这会有效吗?

2 个答案:

答案 0 :(得分:0)

如果您愿意放弃ACID,NoSQL数据库可以帮助您。 一般来说,您无法使用这些查询进行SQL查询,因此您将处理大键值集和列表。 不要过度使用复杂的设置,尝试使用POJO的天真方法,看看它是否有效,如果没有,请尝试Redis。

答案 1 :(得分:0)

您探索的最短路径是Oracle的TimesTen。由于它也是Oracle产品,它(可能)最容易与您当前的系统集成。在(非常)高级别,您可以将其固定,并且,它是Oracle数据库的内存缓存,并将自动保持同步。而且,您将能够使用相同的SQL操作。

如果这无法满足您所需的性能,您可以查看我公司的产品eXtremeDB。我们有不少客户将其用作Oracle的前端缓存。它不是Oracle产品,因此您可能不得不调整与Oracle一起使用的SQL,并且要做一些工作要做以使eXtremeDB与Oracle保持同步(但与使用NoSQL / key相比,工作要少得多 - 价值对解决方案)。回报是eXtremeDB比TimesTen快得多(Oracle的许可证不允许发布基准测试,所以我不能更具体)。