Power BI レポートってデータソースへの接続モードでどれくらい速さに差が出るの？その② インポート vs DirectQuery vs ハイブリッド テーブル （Power BI サービス 編）

# はじめに
2023年5月に [Microsoft Fabric が発表](https://powerbi.microsoft.com/ja-jp/blog/introducing-microsoft-fabric-and-copilot-in-microsoft-power-bi/)され、データ分析を取り巻く世界が変わる予感がする中ではありますが、[前回の Power BI Desktop 編](https://qiita.com/rygondo/items/6222e4784472d0d43694)の続きとなる、Power BI サービス編をお送りしていきたいと思います。Power BI サービスからデータソースへ接続する際は、接続モードの他に、オンプレミスデータゲートウェイ経由にしないといけないケースもあるため、そのような場合についてもどれくらいパフォーマンスに影響が出るか検証していきたいと思います。

### 注意事項（再掲）
本記事の結果は、サンプルケースで測定された検証結果です。実際の利用環境（レポートデザイン、データモデル、データ量、ネットワーク、データソースの種類、同時実行数など）によっては、パフォーマンスに大きな違いが生じる可能性があります。そのため、本記事はあくまで参考程度にとらえていただき、実際のパフォーマンスはご自身の実行環境で試してみることをお勧めします。

# 今回使用した検証環境

- プラットフォーム ：Power BI サービス
※ 今回の手順は、DAX Studio から Power BI サービスのデータセットに、XMLA エンドポイント接続するため、Premium Per User もしくは Premium Per Capacity が必要です
- データソース：Azure SQL Database
- 接続モード：
    - インポート
    - DirectQuery
    - DirectQuery（オンプレミスデータゲートウェイ経由）
    - ハイブリッド テーブル
    - ハイブリッド テーブル（オンプレミスデータゲートウェイ経由）

でレポートを表示した場合のパフォーマンスを測定していきます。

### 全体図
全体をざっくり表した図は以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/1a6f6bd3-5a76-3694-55b0-a3bac66125fd.png)

### Azure 基盤 のスペック
- Azure SQL Database
    - モデル : vCore
    - コンピューティングレベル : サーバーレス
    - サービスレベル : 汎用
    - ハードウェアの種類 : Standard シリーズ (Gen5) : 最大仮想コア数 **16** で設定
    - リージョン : 東日本

- Azure VirtualMachine (オンプレミスデータゲートウェイ用）
    - OS : Windows Server 2022 Datacenter 
    - サイズ : Standard B8ms (**8 vcpu、32GiB メモリ**)
    - リージョン : 東日本

### その他
以下については前回の Power BI Desktop 編と同様です
- [データ内容](https://qiita.com/rygondo/items/6222e4784472d0d43694#%E3%83%87%E3%83%BC%E3%82%BF%E5%86%85%E5%AE%B9)
- [データモデル](https://qiita.com/rygondo/items/6222e4784472d0d43694#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB)
- [表示するレポート](https://qiita.com/rygondo/items/6222e4784472d0d43694#%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88)

# 測定検証パターン
検証パターンとして、インポート、DirectQuery、DirectQuery（オンプレミスデータゲートウェイ経由）、ハイブリッドテーブル、ハイブリッドテーブル（オンプレミスデータゲートウェイ経由）の 5 つのパフォーマンスを比較します。
|No|接続方式|オンプレミスデータゲートウェイ|データソース|
|:-:|:--|:-:|:--|
|1|インポート||Azure SQL Database|
|2|DirectQuery||Azure SQL Database|
|3|DirectQuery|〇|Azure SQL Database|
|4|ハイブリッド テーブル||Azure SQL Database|
|5|ハイブリッド テーブル|〇|Azure SQL Database|

# Power BI サービスでのパフォーマンス測定方法
Power BI サービスでは、Power BI Desktop 編で使用したパフォーマンスアナライザは使えないため、どのような形でパフォーマンス測定をするべきか迷いましたが、以下の方法でパフォーマンス測定することにしました。

- Power BI サービスでのレポートのページ全体の表示時間
    - 初回表示（ブラウザの更新ボタンを押下してから表示完了までの時間）
    - スライサー変更 (日付の期間を 2018年1月1日～2023年4月30日 → 2017年1月1日～2023年4月30日 に変更)
- 各ビジュアルを表示するために実行される DAX クエリの実行時間

Power BI Desktop 編では、各ビジュアルの表示時間を計測していましたが、今回はページ全体の表示時間のみとします。初回起動時は読み込みなどに時間がかかるため、初回表示とスライサー変更の 2 種類のパフォーマンス測定を行うとともに、それぞれ各ビジュアルの DAX クエリの時間も測定します。

これらを計測するために以下の 2 つのツールを使用します

### パフォーマンス測定ツール
- [Microsoft Edge DevTools](https://learn.microsoft.com/ja-jp/microsoft-edge/devtools-guide-chromium/overview)
    - **ページ全体の表示時間**を取得
※[パフォーマンス機能](https://learn.microsoft.com/ja-jp/microsoft-edge/devtools-guide-chromium/evaluate-performance/reference)を利用
- [DAX Studio](https://daxstudio.org/)
    - 各ビジュアル表示ために発行される **DAX クエリの実行時間**を取得

### 測定準備
1. DAX Studio を Power BI サービスのデータセットへ接続する
    1. Power BI サービスで測定するレポートのワークスペースを開き、「ワークスペースの設定」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/346d991e-ad47-148b-d766-a57dcd38bdb2.png)

    1. 「ワークスペースの設定」の「プレミアム」の「ワークスペース接続」からワークスペースの URL を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/3c2f0567-c693-9adb-6b35-46332b91113e.png)

    1. DAX Studio を起動して、接続のダイアログで「Tabular Server」を選択し、取得したワークスペース URL を貼り付け、「Connect」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/cdb42657-f15d-5712-cd80-62b95d03e782.png)
    1. Power BI サービスへサインイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/897dbf74-bfdb-4188-a2e8-a023e534e5a6.png)
    1. DAX Studio で接続するデータセットを選択し、データセット内にあるテーブルが表示されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/a55c3fd6-8e96-61c6-aeb8-f2f248ec568a.png)
    1. All Queries をクリックしてトレース開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/ada5955a-05de-7899-3864-416548e3e8a2.png)


1. Microsoft Edge DevTools （特別な設定無し）
    1. Microsoft Edge ブラウザで、Power BI サービスの測定するレポートを開き、F12 キーを押して Microsoft Edge DevTools を開き、パフォーマンス機能を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/28c0e931-643a-e592-f17f-7290008d5aac.png)

### 測定手順    
1. 測定手順（※初回表示(ブラウザ更新)の時間）
    1. 測定するページの Microsoft Edge DevTools のパフォーマンスの録音ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/7cd4f94a-8011-3bdb-efb7-d6aa64cb8fe0.png)
    1. ブラウザの更新ボタンを押し、レポートの表示が完了したら、Microsoft Edge DevTools のパフォーマンスの停止ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/d4566c08-f530-649e-1516-d9d9c32f8478.png)
    1. Microsoft Edge DevTools のパフォーマンスの結果画面で、ブラウザの更新開始したタイミングから更新完了までの期間を指定してその範囲の時間を計測
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/24fa64a2-c630-912f-79ae-045a81a1c8c8.png)


1. 測定手順（※2 回目表示(スライサー変更)の時間）
    1. Microsoft Edge DevTools のパフォーマンスの結果画面でクリアボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/51830cfa-6d12-d6f3-f239-5257cb1f3870.png)
    1. DAX Studio で、キャッシュのクリアを行う
初回表示時のキャッシュが残っているため、2回目表示測定のために、DAX Studio の 「Home」→ 「Clear Cache」ボタンをクリックしてキャッシュをクリアする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/99b0010c-71e9-d889-cbf4-2cc802bed2c0.png)
    1. SQL Database のデータベースのキャッシュクリア
以下のクエリを SSMS などで発行し、SQL Database のクエリキャッシュをクリアする
    ```
    CHECKPOINT; 
    GO 
    DBCC DROPCLEANBUFFERS; 
    GO
    ```

    1. 測定するページの Microsoft Edge DevTools のパフォーマンスの録音ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/7cd4f94a-8011-3bdb-efb7-d6aa64cb8fe0.png)
    1. スライサーの値を変更し、レポートの表示が完了したら、Microsoft Edge DevTools のパフォーマンスの停止ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/6e028b25-6b04-b05f-1341-3ed8a5ea0884.png)

    1. Microsoft Edge DevTools のパフォーマンスの結果画面で、ブラウザの更新開始したタイミングから更新完了までの期間を指定してその範囲の時間を計測
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/257d937a-2f78-0e76-ad3a-d8d9d4f9314a.png)

1. 測定手順（※DAX のクエリ実行時間）
    1. DAX Studio の All Queries を確認し、初回表示時のDAXクエリ(5つ)と 2回目表示のDAXクエリ(5つ)の実行時間が記録されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/9909046d-dd4b-2f63-3259-9f9d898d073a.png)

# 検証結果
それでは、上記条件で実行していったパフォーマンス測定結果を以下掲載していきます。
※表示時間の**太字**はその中での最長時間

## 1. Power BI サービス - インポート

### 初回表示(ブラウザ更新)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**7706 ミリ秒**|-|
||カード||47 ミリ秒|
||縦棒グラフ||63 ミリ秒|
||地図||31 ミリ秒|
||折れ線グラフ||47 ミリ秒|
||散布図||**219 ミリ秒**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/e851cb6b-7060-93ed-2070-44ee8e5f3ff4.png)

### 2 回目表示(スライサー変更)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**780 ミリ秒**|-|
||カード||78 ミリ秒|
||縦棒グラフ||78 ミリ秒|
||地図||47 ミリ秒|
||折れ線グラフ||62 ミリ秒|
||散布図||**188 ミリ秒**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/e4df09f2-cd99-65f5-11b3-b8fd47ab2a39.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/bd08e434-96e0-ec04-1cc1-da42e3b5b106.png)



## 2. Power BI サービス - DirectQuery

### 初回表示(ブラウザ更新)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**11409 ミリ秒**|-|
||カード||6110 ミリ秒|
||縦棒グラフ||**6156 ミリ秒**|
||地図||4095 ミリ秒|
||折れ線グラフ||3969 ミリ秒|
||散布図||**6156 ミリ秒**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/29eaea4f-188d-ec9d-17ee-4a0d5b0daf55.png)

### 2 回目表示(スライサー変更)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**6262 ミリ秒**|-|
||カード||**5156 ミリ秒**|
||縦棒グラフ||4672 ミリ秒|
||地図||4125 ミリ秒|
||折れ線グラフ||3969 ミリ秒|
||散布図||4891 ミリ秒|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/e88c772b-aa63-5907-a120-353074ffa1fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/a12d5eaa-afb8-9821-925b-6ed2869370bc.png)

## 3. Power BI サービス - DirectQuery（オンプレミスデータゲートウェイ経由）

### 初回表示(ブラウザ更新)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**18613 ミリ秒**|-|
||カード||5328 ミリ秒|
||縦棒グラフ||6188 ミリ秒|
||地図||**12281 ミリ秒**|
||折れ線グラフ||3578 ミリ秒|
||散布図||6109 ミリ秒|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/f4a30830-0a2b-e99c-8e91-e591b1239de6.png)

### 2 回目表示(スライサー変更)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**13709 ミリ秒**|-|
||カード||5817 ミリ秒|
||縦棒グラフ||5786 ミリ秒|
||地図||**12931 ミリ秒**|
||折れ線グラフ||3877 ミリ秒|
||散布図||5220 ミリ秒|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/bca68258-269d-8477-ca5b-e228bad74ea0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/902d466e-8aff-524b-c443-5a4611983147.png)


## 4. Power BI サービス - ハイブリッド テーブル

### 初回表示(ブラウザ更新)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**9501 ミリ秒**|-|
||カード||1159 ミリ秒|
||縦棒グラフ||797 ミリ秒|
||地図||1719 ミリ秒|
||折れ線グラフ||1594 ミリ秒|
||散布図||**2234 ミリ秒**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/d11689cb-d61d-29d7-a9f3-c2ef258d4bf2.png)


### 2 回目表示(スライサー変更)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**3213 ミリ秒**|-|
||カード||1141 ミリ秒|
||縦棒グラフ||828 ミリ秒|
||地図||1360 ミリ秒|
||折れ線グラフ||1453 ミリ秒|
||散布図||**2031 ミリ秒**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/2296e843-0340-1863-1b88-2b32930bbd6a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/f4d63bd3-85f0-a501-86ad-685d59fbad48.png)

## 5. Power BI サービス - ハイブリッド テーブル（オンプレミスデータゲートウェイ経由）

### 初回表示(ブラウザ更新)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**10079 ミリ秒**|-|
||カード||1250 ミリ秒|
||縦棒グラフ||891 ミリ秒|
||地図||1500 ミリ秒|
||折れ線グラフ||1469 ミリ秒|
||散布図||**2141 ミリ秒**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/497dc1db-4861-fc05-4fe1-2f27aaa40229.png)

### 2 回目表示(スライサー変更)
|項目|ビジュアル|表示時間|(うち、DAX クエリ実行時間)|
|:--|:--|--:|--:|
|レポート全体の表示時間|-|**3771 ミリ秒**|-|
||カード||1297 ミリ秒|
||縦棒グラフ||859 ミリ秒|
||地図||1594 ミリ秒|
||折れ線グラフ||1609 ミリ秒|
||散布図||**2359 ミリ秒**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/b4a15188-3a11-185a-647b-7f9162752fee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/95f93918-7bec-14fc-c1b7-17e8d01c9aab.png)

# まとめ
|接続モード|レポート表示時間(初回表示(ブラウザ更新))|レポート表示時間(2 回目表示(スライサー変更))|
|:--|--:|--:|
|インポート|7706 ミリ秒|780 ミリ秒|
|DirectQuery|11409 ミリ秒|6262 ミリ秒|
|DirectQuery（オンプレミスデータゲートウェイ経由）|18613 ミリ秒|13709 ミリ秒|
|ハイブリッド テーブル|9501 ミリ秒|3213 ミリ秒|
|ハイブリッド テーブル（オンプレミスデータゲートウェイ経由）|10079 ミリ秒|3771 ミリ秒|

今回の環境では、パフォーマンスとしては、
**インポート ＞ ハイブリッド テーブル ≒ ハイブリッド テーブル（オンプレミスデータゲートウェイ経由）＞ DirectQuery ＞ DirectQuery（オンプレミスデータゲートウェイ経由）**
となりました。
Power BI Desktop 編同様、やはりインポートは爆速で、DirectQuery はやや待たされる感じ、ハイブリッド テーブルは中間くらいという結果が出ました。
また、オンプレミスデータゲートウェイについては、DirectQuery は大きく影響が出るのに対し、ハイブリッド テーブルではあまり影響が出なかった点は意外でした。このあたりは環境によっては結果が変わるのかもしれません。
接続モードの選択は、要件やその時の環境によるとは思いますが、こちらの検証結果も一つの参考情報として検討いただければと思います。

# 補足
Microsoft Fabric では [Direct Lake](https://learn.microsoft.com/ja-jp/power-bi/enterprise/directlake-overview) という新しい接続方式が出てきているため、こちらも頃合いをみて検証していきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/44e627fa-a014-055a-c088-aecf5cfd7f58.png)