文脈上、私は SSAS の専門家ではなく、熱心なユーザーでさえありません。私は主に Java 開発者です。SSAS を使用してさまざまなモデルを作成、開発、テストするデータ サイエンス チームがあります。
これらのモデルの出力を Microsoft 以外の他のシステムと統合するために、Olap4j/XMLA を使用してキューブから特定のフィールドをクエリし、MDX クエリを実行できる Java ベースのサービスを構築しています。しかし、パフォーマンス (またはその欠如) は私を混乱させます。
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 でトラフィックを圧縮して、同じ量のデータを 1 秒以内に取得する MSS と同様のパフォーマンスを olap4j で得る方法はありますか?