最近遇到了一个比较头疼的数据库优化问题,业务需要对一个每天有50w条数据加载的维度表进行实时统计分析,并且统计分析的sql是根据界面选择动态生成的(组合情况太多)。最开始考虑写个过程每天晚上预先统计分析,但是情况太多根本没法预先统计。也考虑过改变表设计使用星型模型,发现转换后数据会翻7倍左右,一天的数据就变成近400w,经过测试根本行不通。然后从索引上想办法,使用了四个全文索引,四个bitmap索引,查询有了比较大的提高。接着sga调整、把表顶在内存(keep pool)、使用大页(hugepage)管理、索引开启并发等。最终一周的统计单条sql在1s以内,基本没有物理读,不过这种sql都是比较消耗cpu的,一致性读比较高,在多用户并发下,性能会降低,比较多,使用LoadRunner测试,发现在50用户并发查询时,平均响应时间在12s多。使用nmon发现,性能的瓶颈在cpu。最后没办法,想到oracle 11g有的sql结果缓存的特性,测试效果还算理想。下面大概总结下结果缓存特性的使用,其实很简单。
相关hint:
RESULT_CACHE、NO_RESULT_CACHE
当你设置RESULT_CACHE_MODE为MANUAL时,如果想缓存SQL结果则必须在SQL中添加RESULT_CACHE这个hint.并且如果你这个SQL的结果已经缓存,下次查询时也必须在sql中有RESULT_CACHE这个hint,数据库才会从缓存的结果集中去结果,否则会从基表中查询。
相关的初始化参数:
RESULT_CACHE_MODE
Property | Description |
---|---|