PowerBI データの取得
Microsoft Power BI XMLA は、データをキューブとして公開するOLAP データベースで、MDX(マルチディメンション式)でクエリします。 本製品 は、これらのキューブをSQL-92 でクエリできるリレーショナルビューにモデル化します。以下のマッピングは、モデルのレイアウト用です:
- Catalog - 本製品 にカタログとして表示されます。
- Cube - 本製品 にスキーマとして表示されます。
- Measure - 本製品 の特別なMeasures ビューの下で利用可能です。
- Dimension - 各ディメンションはビューとして公開されます。
- Level - 階層の個々のレベルは、適切なディメンションビューのカラムとして公開されます。
メジャーとディメンションの結合
特定のレベル値ごとにメジャーを取得するには、Measure ビューと任意のDimension もしくはディメンションのセット間でJOIN を発行します。
例えば、次のように発行すると、各都市の顧客数を取得できます。
SELECT m.[Customer Count], c.[City] FROM [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Customer AS c INNER JOIN [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Measures AS m
ON 条件は必要ないことに注意してください。これは、テーブルがMicrosoft Power BI XMLA ですでに適切に関連付けられているためです。 ON 条件を必要とするツールを使用している場合は、IncludeJoinColumns をtrue に設定してください。 これにより、各ビューに複数の外部キーカラムが追加され、相互に関連付けられます。 これらのカラムはそれ自体ではデータを返しませんが、必要に応じて結合のON 条件を構築するツールを使用して自動的に取得できます。
データの集計
Microsoft Power BI XMLA に格納されているデータはすでに集計済みです。多くの場合、集計を取得しようとすることは、何も指定しないことと構文的に同じになるかもしれません。
例えば、次のクエリは、前のクエリとまったく同じデータを返します。
SELECT SUM(m.[Customer Count]), c.[City] FROM [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Customer AS c INNER JOIN [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Measures AS m GROUP BY c.[City]
このルールの例外は、フィルタリングされた結果の集計がリクエストされた場合です。
そのような場合、計算はMicrosoft Power BI XMLA からリクエストされます。例えば、
フランスとドイツの顧客の合計と平均を計算するには:
SELECT SUM(m.[Customer Count]), AVG(m.[Customer Count]), c.[Country] FROM [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Customer AS c INNER JOIN [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Measures AS m WHERE c.[Country] IN ('France', 'Germany') GROUP BY c.[Country]
複数の階層の選択
Microsoft Power BI XMLA では、個々のディメンジョンは、1つ以上のレベルを持つ階層で構成されています。例えば、 AdventureWorks Customers テーブルにはCity、Country およびGender があります。City とCountry は同じ階層の一部ですが、 Gender は独自の階層です。
複数の階層を選択する場合、これをサポートする方法はMDX の値をクロス結合することです。本製品 が提示するデータのリレーショナルテーブルモデルからは明らかではありませんが、これにより非常に負荷の高いクエリが実行される可能性があります。
例えば、次のように実行すると:
SELECT c.[Country], m.[Customer Count] FROM [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Customer AS c INNER JOIN [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Measures AS m
結果は6行になります。しかし、Gender も選択すると:
SELECT c.[Country], c.[Gender], m.[Customer Count] FROM [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Customer AS c INNER JOIN [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Measures AS m
結果は12行になります。これは、Gender とCountry が異なる階層にあるため、両方一緒に返すにはクロス結合が必要だからです。
SELECT に追加された各階層は、その階層で利用可能な値の数で合計結果を乗算します。
したがって、期待する行数を取得するには、次のように実行します:
SELECT (COUNT(c.[Country])*COUNT(c.[Gender])) AS totalrows FROM [AdventureWorksDW2012Multidimensional-SE].[Adventure Works].Customer AS c
応答行の制限
複数の階層を選択すると、結果行の合計数が倍になるため、応答行の数が非常に速く膨らみタイムアウトが発生します。 どのクエリが非常に高負荷になるかをある程度可視化するために、理想的な設定に導くメカニズムとしてResponseRowLimit 接続プロパティが追加されました。 設定すると、クエリが実行される前に予想される行数が計算されます。 予想された行の数が制限を超えると、クエリで予想される行数を表示するエラーがスローされます。
必要なカラムのみを選択するか、WHERE 条件を適用することをお勧めします。どちらも応答行の数を大幅に減らすことができ、パフォーマンスに大きな影響を与えます。 本製品 に精通していて、どのクエリが高負荷になる可能性があるかをすでにお分かりの場合は、ResponseRowLimit を0に設定することで無効にできます。