在 MDX 查询中组合关系数据和 OLAP 数据

Posted

技术标签:

【中文标题】在 MDX 查询中组合关系数据和 OLAP 数据【英文标题】:Combining Relational and OLAP data in an MDX Query 【发布时间】:2012-10-15 12:50:08 【问题描述】:

我有一个 SSAS 2008 多维数据集,用于存储股票市场的日终财务数据。该多维数据集仅在市场收盘后每天处理一次,因此它永远不会包含有关当前日内交易数据的任何信息。我还有一个关系数据库,其中包含股票当前的日内交易信息。我正在尝试找到一种方法来组合这两个数据源,以便我可以执行计算,例如基于当前价格的股票的 30 天移动平均线以及前 29 天的历史数据。我使用的是 SSAS 标准版,因此我无法访问诸如主动缓存或多个分区等功能来帮助我近乎实时地处理当前数据。

对于单个查询的上下文,有什么方法可以动态地将我的 SQL 数据库中的行包含到我的事实表中?本质上只是暂时将一小部分数据带入多维数据集,以便处理某个计算?

【问题讨论】:

听起来您有 SQL 企业版的业务案例。你可以在开发者版中模拟一下,看看老板会不会喜欢它。 @Bill 不幸的是,该项目的企业许可成本高得令人望而却步。 【参考方案1】:

不,您应该创建一个映射到您的 OLTP 表的度量值组

【讨论】:

如果我为我的 OLTP 表创建一个单独的度量值组,并使用与我的 OLAP 表完全相同的度量值,是否有可能以某种方式将它们合并到一个集合中?本质上是在查询中将 OLTP 表中的行追加到 OLAP 表中? 你需要一把钥匙才能做到这一点。不要忘记,你所有的 OLAP 数据都来自一个 OLTP 数据库,所以原理是一样的。如果您只需要 1 行数据,您可能有一个事实甚至一个维度(例如称为配置),其中一行 ID=1,而在您的其他对象上,您需要一个值为 1 的 configID 字段。 看起来这最终是最好的解决方案。我将尝试使用计算成员和 CASE 语句来合并列。希望它不会变得太乱! :)【参考方案2】:

您应该能够为当天的数据创建一个分区并将 ROLAP 指定为存储模式。

为了简化维护,我可能会为事实表创建一个视图,并在定义中的 where 子句中使用日期函数。比如:

CREATE VIEW CurrentTrades AS

SELECT * FROM factTrades 
    WHERE TradingDate BETWEEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) AND DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))

然后您可以将该视图用作 ROLAP 分区的数据源。

【讨论】:

我遇到的问题是我使用的是 SSAS Standard,而不是 Enterprise,这将我限制为度量值组的单个分区。是否有某种方法可以对历史数据和当前数据使用单独的度量组? 天哪,对不起。没有意识到标准存在分区限制。一种选择是使用 OLAP 链接服务器通过 OPENQUERY 和 MDX 查询多维数据集部分。将结果推送到临时表或表变量,然后从 T-SQL 进行计算。【参考方案3】:

您可以在一天中的特定时间间隔以增量方式处理多维数据集的数据,具体取决于处理新数据所需的时间。 (当然如果延迟是可以接受的)

【讨论】:

不幸的是,在我的情况下,任何重大延迟都是不可接受的。我需要能够在移动平均计算中包括(例如)今天下午 2:15 的股票价格。【参考方案4】:

可以编写自己的 DLL 并从 MDX 中调用它。这不是非常优雅,但我过​​去曾这样做过。

对于 1000 行数据来说不是一个好主意,但如果您需要少于 100 行,您的函数调用可以将一个值从 MDX 传递给 DLL,后者可以调用 SQL 数据库以返回数字。然后,您的结果将与来自 OLAP 的数字一起显示在单元集中。

【讨论】:

以上是关于在 MDX 查询中组合关系数据和 OLAP 数据的主要内容,如果未能解决你的问题,请参考以下文章

MDX

来自 PHP 的 MDX 查询

我可以查询 OLAP 多维数据集的附加信息吗?

如何评估 MDX 在 OLAP 处理中的性能

添加 where 条件使 MDX 查询变慢(olap4j)

用于 MDX 的智能感知?