项目中最近需要使用mondrian,于是开始首先阅读以下mondrian的源代码,总体看来mondrian是一个ROLAP引擎,但是它的定位还是一个以库形式 提供的组件,而不是作为服务,例如它将所有的缓存都放在进程内部,当我在一个进程中创建多个cube并且一直保持着他们的connection会导致OOM,所以对mondrian作为服务化的首要改造还是在于如何将mondrian的缓存挪出本进程,放到第三方的存储系统例如redis、hbase等NOSQL存储系统中,这样一方面可以解决上面提到的进程内缓存问题,另一方面可以将数据独立出去可以将服务器做成无状态的,可以水平扩展,保证高可用性。除了缓存这一步之外,另外需要对mondrian做优化的地方还有生成SQL这一部分,mondrian生成的SQL主要包括查看一个level下所有的member和查看一个cell结果这两类,前者无非就是select distinct xxx或者select xxx group by xxx,mondrian一般使用select distinct的方式,这种没有什么可以优化的地方,另外还有一种查询是查询多个维度聚合之后的某一个度量的值,一般是多个维度group by之后计算某一列的sum、avg等值,但是如果在group by之前需要过滤掉一些元素的话,mondrian会将剩余的语句翻译成where xxx IN (xxx1, xxx2,...)(通过执行日志可以看到),这种SQL执行效率是比较低的,即使xxx这一列有主键,改造的方案是尽可能得将IN语句改成多个between或者大于小于这样的SQL,这个的优先级可以低一些。
上面提到的是对mondrian本身不足需