就上下文而言,我不是 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].&[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].&[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].&[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].&[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].&</UName>
<Caption/>
<LName>[Main].[Measure03].[Measure03]</LName>
<LNum>1</LNum>
<DisplayInfo>131072</DisplayInfo>
<MEMBER_UNIQUE_NAME>[Main].[Measure03].&</MEMBER_UNIQUE_NAME>
<MEMBER_VALUE xsi:nil="true"/>
</Member>
所以看起来缓慢可能实际上都是网络流量!有没有办法让 olap4j/IIS/SSAS 压缩流量,这样我就可以在 olap4j 中获得与使用 MSS 类似的性能,在一秒钟内检索到相同数量的数据?