繁体   English   中英

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

[英]How to store a huge (Oracle) dataset in memory cache

说明:我有一个事务表,平均每秒插入约200(+ -100)行,本系统从中查询基于客户机ID的有/无时间(按升序排列)的数据,并且很少其他条件。 对该表进行分区,使得该表仅包含当前日期的数据,而较早的数据存储在<table_name_date_year>上。 在此表上运行查询以为客户生成各种详细的报告。

最近一项为提高性能而进行的更改,1)获取表的最小和最大值,2)并行查询每50000条记录上的表(一次仅查询5条),并在<from>和<to>之间的条件下运行查询,直到达到最大值3)生成报告,4)合并报告。

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

是否可以使用内存中的数据缓存(如memcached或redis(或ehcache?)或“任何其他缓存框架”)来存储/更新根据客户端ID存储的数据,以便报告系统从缓存中获取数据并生成报告,而不是直接从thge primary-db查询? (例如:<密钥,对>,<客户端ID,{数据集}>)如果可以的话?

可以在这里使用像HAZELCAST或Terracotta或(我对此没有太多探讨)或Apache Gora这样的大数据实现吗? 如果可以,怎么办?

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

如果您愿意放弃ACID,NoSQL数据库可以为您提供帮助。 一般来说,您没有能力使用它们执行SQL查询,因此您将要处理大型键值集和列表。 不要为复杂的设置而烦恼,尝试使用POJO的简单方法,看看它是否有效,否则,请尝试Redis。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM