描述:I有一个事务表,平均每秒插入200 (+-100)行,从该表中,当前系统根据带有/不带时间(通过升序)和很少有其他条件的客户端ids查询数据。该表的分区方式是,该表仅包含当前的数据,早期的数据存储在< table_name_date_year >上。此查询在此表上运行,以为客户生成各种详细报告。
最近的一项改进是为了提高性能,1)取表的min和max,2)并行地查询每50000条记录(每次只有5条记录),以< from >和< to >之间的条件运行查询,直到最大值达到3)生成报告,4)合并报告。
问题:已经完成了数据库开发人员的各种查询调优,查询运行速度仍然较慢(需要很多分钟才能完成)。
内存中的数据缓存可以像memcached或redis (或者ehcache)吗?或者使用“任何其他缓存框架”来存储/更新存储在客户端id上的数据,例如报告系统从缓存中获取数据并生成报告,而不是直接从thge主db查询?(例如:< key,偶对>,< client-id,{ dataset } >)如果是这样的话?
像HAZELCAST或Terracotta这样的大数据实现或者(我还没有对此进行过多的研究)或Apache这样的大数据实现可以在这里使用吗?如果是的话,怎么做?
可以使用MappedByteBuffer开发基于Java的解决方案,但这会有效吗?
发布于 2014-01-09 07:49:57
如果您愿意放弃ACID,NoSQL数据库可以帮助您。一般来说,您无法对这些查询执行SQL查询,因此您将处理大的键值集和列表。不要对复杂的设置过火,用POJO尝试一种天真的方法,看看它是否有效,如果不行,就试试Redis。
发布于 2014-01-10 00:26:58
您要探索的最短路径是甲骨文的TimesTen。由于它也是Oracle产品,所以它将(可能)最容易与当前系统集成。在一个(非常)高级别上,您只需将其栓在上,poof,它就是Oracle数据库的内存缓存,并将自动保持同步。而且,您将能够使用相同的SQL操作。
如果这不能让你达到你所需要的性能,你可以看看我公司的产品eXtremeDB。我们有相当多的客户使用它作为Oracle的前端缓存。它不是甲骨文产品,所以你在甲骨文中使用的SQL可能需要调整,为了使eXtremeDB与甲骨文保持同步,还有一些工作要做(但是比起使用NoSQL/键值对解决方案,工作量要小得多)。好处是,eXtremeDB比TimesTen快得多(甲骨文的许可证不允许发布基准测试,所以我不能说得更具体)。
https://stackoverflow.com/questions/21014349
复制相似问题