首页 > 解决方案 > MSS Studio 与 Java MDX 中 SSAS 查询的性能差异

问题描述

就上下文而言,我不是 SSAS 专家,甚至不是狂热的用户,我主要是 Java 开发人员。我们有一个使用 SSAS 编写、开发和测试各种模型的数据科学团队。

为了将这些模型的输出与其他非 Microsoft 系统集成,我正在构建一个基于 Java 的服务,该服务可以使用 Olap4j/XMLA 从多维数据集中查询某些字段以运行 MDX 查询。但是表现(或缺乏表现)让我感到困惑。

如果我打开 MSS Studio,“浏览”多维数据集,将一些度量拖到度量窗格中,切换“显示空单元格”(否则由于某种原因我没有得到任何结果),然后点击执行,我几乎立即得到预期结果. 如果我单击红色方块关闭“设计模式”,它会将我带到 MDX 代码,如下所示:

SELECT { } ON COLUMNS, { (
    [Main].[Measure01].[Measure01].ALLMEMBERS * 
    [Main].[Measure02].[Measure02].ALLMEMBERS * 
    [Main].[Measure03].[Measure03].ALLMEMBERS * 
    [Main].[Measure04].[Measure04].ALLMEMBERS 
) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( 
  SELECT ( { 
    [Main].[Measure01].&[1] 
} ) ON COLUMNS FROM [Model]) 
CELL PROPERTIES VALUE

如果我将此 MDX 查询粘贴到我的 Java 应用程序中并运行它,则使用以下代码需要 30 多秒才能返回结果:

    Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
    Connection connection = DriverManager.getConnection(cubeUrl);
    OlapConnection olapConnection = connection.unwrap(OlapConnection.class);
    olapConnection.setCatalog(catalog);

    OlapStatement statement = olapConnection.createStatement();

    LOG.info("Running Cube query");

    CellSet cellSet = statement.executeOlapQuery("<<The MDX Query here>>");

我添加的措施越多,它变得越慢。我已经尝试在我的代码中放置一些日志记录和调试断点,但看起来确实是 SSAS 本身在返回我的数据时速度很慢。

请记住,我对 SSAS 知之甚少,我可以尝试什么?Olap4j 是否有一些我没有设置的配置选项?MSS Studio 是否在幕后做了一些我无法复制的优化?

编辑1:

预感我安装了 Wireshark 来监控我的网络流量,当我的查询运行时,我看到我的笔记本电脑和 SSAS 服务器之间有数十万甚至数百万的数据包。网络数据包很难解释,但其中很多似乎都在发送带有测量值的 HTTP 数据。例如:

<Member Hierarchy="[Main].[Measure01]">
    <UName>[Main].[Measure01].&amp;[0]</UName>
    <Caption>0.00</Caption>
    <LName>[Main].[Measure01].[Measure01]</LName>
    <LNum>1</LNum>
    <DisplayInfo>131072</DisplayInfo>
    <MEMBER_CAPTION>0.00</MEMBER_CAPTION>
    <MEMBER_UNIQUE_NAME>[Main].[Measure01].&amp;[0]</MEMBER_UNIQUE_NAME>
    <MEMBER_NAME>0</MEMBER_NAME>
    <MEMBER_VALUE xsi:type="xsd:double">0</MEMBER_VALUE>
</Member>
<Member Hierarchy="[Main].[Measure02]">
    <UName>[Main].[Measure02].&amp;[0]</UName>
    <Caption>0</Caption>
    <LName>[Main].[Measure02].[Measure02]</LName>
    <LNum>1</LNum>
    <DisplayInfo>131072</DisplayInfo>
    <MEMBER_CAPTION>0</MEMBER_CAPTION>
    <MEMBER_UNIQUE_NAME>[Main].[Measure02].&amp;[0]</MEMBER_UNIQUE_NAME>
    <MEMBER_NAME>0</MEMBER_NAME>
    <MEMBER_VALUE xsi:type="xsd:double">0</MEMBER_VALUE>
</Member>
<Member Hierarchy="[Main].[Measure03]">
    <UName>[Main].[Measure03].&amp;</UName>
    <Caption/>
    <LName>[Main].[Measure03].[Measure03]</LName>
    <LNum>1</LNum>
    <DisplayInfo>131072</DisplayInfo>
    <MEMBER_UNIQUE_NAME>[Main].[Measure03].&amp;</MEMBER_UNIQUE_NAME>
    <MEMBER_VALUE xsi:nil="true"/>
</Member>

所以看起来缓慢可能实际上都是网络流量!有没有办法让 olap4j/IIS/SSAS 压缩流量,这样我就可以在 olap4j 中获得与使用 MSS 类似的性能,在一秒钟内检索到相同数量的数据?

标签: javassasolap4j

解决方案


推荐阅读