MSS Studio与Java MDX在SSAS查询中的性能差异

时间:2019-04-29 14:58:14

标签: java ssas olap4j

就上下文而言,我不是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相似的性能,在一秒钟之内可以检索到相同数量的数据?

0 个答案:

没有答案