【发布时间】:2014-11-12 22:10:55
【问题描述】:
我想知道是否有可以处理 MDX 的 内存中 OLAP 服务器。
我找到了Wikipedia article。 但它没有说明内存中的功能......
我所知道的只有 Mondrian,它也是上面 wiki 文章中提到的两个开源解决方案之一。
到目前为止,我只是与 Mondrian 一起工作过......我不认为 Mondrian 是一个真正的内存中 OLAP 服务器。
原因如下:
它有一个内存缓存,其中包含查询结果。但是它们的第一次执行需要很长时间,并且必须从 RDBMS 加载。 (http://mondrian.pentaho.com/documentation/faq.php#Scalability)
我认为更好的方法是:
将所有事实和维度表加载到缓存中,然后对该内存中的数据执行每个查询。
据我所知,Oracle 今年将在 12c 企业版中发布在内存中拥有部分(或全部)表的可能性。这将加速 OLAP 服务器,后者仅使用 SQL 查询 RDBMS 事实表。
...但是企业版很贵...
我想听听对此的一些其他意见。
最好的问候,
丹尼斯。
【问题讨论】:
-
您可以通过在 ETL 完成时运行您希望保留在内存中的查询来预热 Mondrian 的缓存。但是,当您在内存中说...显然您的事实表不是数十亿行的事实,否则将不可能将所有内容存储在 RAM 中。这就是为什么蒙德里安甚至不尝试加载所有内容,它应该处理多 Tb 立方体,试图将其全部保存在内存中是没有意义的。达到一定的细节水平......这是一个完全不同的游戏。
-
预热想法听起来像是一个很好且易于实施的解决方法,谢谢。关于多维数据集大小的一些建议:我认为每月大约 5GB 数据,过去 3 年的数据将是 180GB 内存表,用于 olap 系统。多维数据集的数据大部分时间都是预先汇总的,例如一天/一个月的客户收入。因此,即使 DWH 是多 TB 的,数据集市和多维数据集也不必那么大......顺便说一句,如果您的多维数据集是多 TB 大的,您如何加速 mondrian?
-
提高性能的方法太多了,这本身就是一本书。几个总体思路: 1)切换到高性能的面向列的数据库(vertica、infinidb、monetdb 等等); 2) 索引、索引、索引(vertica 中的投影;infinidb 中没有任何内容;莫奈中的索引); 3) 聚合表(mondrian 选择具有我们要求的详细程度的最小聚合表); 4)缓存,很多,在多个级别(DB缓存,蒙德里安缓存,查询结果缓存等); 5) 到数据库的网络路径; 6) 更简单的 MDX 查询,如果它们太大,则按位分解。等等……
-
@nsousa 的好建议。我再给你推荐一个:IO瓶颈。在一个项目中,我们使用 512GB 的 RAM 作为 DWH 存储。在所有其他 DWH 项目中,我都坚持使用 SSD 磁盘。
-
目前没有 MDX 接口和相当陈旧的开发,但它确实有效,而且速度非常快。不仅仅是因为它在内存中,还因为底层 C 引擎处理 data.table 包中的查询:github.com/jangorecki/data.cube 我希望有一天能重新激活这个项目,并最终添加 MDX 接口支持。
标签: mdx olap mondrian in-memory-database in-memory