2014-01-09 101 views
0

描述:我有一个事务表,每秒插入一个〜200(+ -100)行的平均值,本系统从中查询以检索数据基于客户端ID,有/无时间(按升序排列)以及其他几个条件。此表进行分区时,表格仅包含当天的数据,较早的数据存储在< table_name_date_year>中。查询在此表上运行以生成针对客户的各种详细报告。如何在内存缓存中存储巨大的(Oracle)数据集

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

问题:由数据库开发人员完成各种查询调优后,查询仍然运行速度较慢(需要很长时间才能完成)。

是否可以使用像memcached或redis(或ehcache?)或“任何其他缓存框架”这样的内存数据缓存来存储/更新存储在客户端ID上的数据,以便报告系统获取数据从缓存中生成报告,而不是直接从主数据库查询? (例如:< key,pair>,< client-id,{dataset}>)如果是这样?

像HAZELCAST或兵马俑或(我没有探讨太多这方面)或Apache Gora的bigdata实现可以在这里使用吗?如果是这样如何?

基于Java的解决方案是否可以使用MappedByteBuffer开发,但这样做是否有效?

+0

刚刚从数据库加载数据还是数据库以任何方式聚合/压缩数据?在生成报告时,加载数据的访问模式是什么,例如是流式传输还是有很多点或范围访问?要处理的记录有多大?记录大小是多少?每个记录是否有唯一的密钥?记录是否可以预先聚集或聚集,例如通过在15分钟桶中存储一个客户的记录?该技术是否能够生成纯java报告?报告生成POJO需要数据格式吗? – cruftex

回答

0

如果您愿意放弃ACID,NoSQL数据库可以帮助您。 一般而言,您不具备使用这些查询执行SQL查询的能力,因此您将要处理大型键值集和列表。 不要过度复杂的设置,尝试一个朴素的方法与POJO,看看它是否有效,如果没有,尝试Redis。

0

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

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