クエリ診断による折りたたみについて理解する

クエリ診断を使用する最も一般的な理由の 1 つは、Power Query によって "プッシュダウン" され、バックエンド データ ソースによって行われる操作 (別名 "フォールディング") をよりよく理解するためです。 フォールディング処理された内容を確認するには、"最も具体的な" クエリ、つまり、バック エンド データ ソースに送信されるクエリを確認します。 これは、ODATA と SQL の両方で確認できます。

診断の記録に関する記事で説明されている操作は、基本的に次の 4 つのことを行います。

  • データ ソースに接続する
  • 顧客テーブルを取得する
  • 顧客 ID ロールを "Sales Representative" にフィルター処理する
  • "Country" ごとにグループ化する

ODATA コネクタでは、現在、エンドポイントへの COUNT() のフォールディングはサポートされていません。また、このエンドポイントの操作も多少制限されています。そのため、その最後のステップをフォールディング処理することは想定しません。 一方、フィルター処理は比較的簡単です。 これは、上記で生成された最も具体的なクエリを見てみると、それはまさに確認する内容です。

Request:
GET https://services.odata.org/V4/Northwind/Northwind.svc/Customers?$filter=ContactTitle eq 'Sales Representative'&$select=CustomerID%2CCountry HTTP/1.1

Response:
https://services.odata.org/V4/Northwind/Northwind.svc/Customers?$filter=ContactTitle eq 'Sales Representative'&$select=CustomerID%2CCountry
HTTP/1.1 200 OK

「営業担当者」に等しい ContactTitle のテーブルをフィルタリングし、顧客 ID と国という 2 つの列のみを返していることがわかります。 もちろん、Country はグループ化操作に必要です。これは、ODATA エンドポイントによって行われないので、ローカルで行う必要があります。 ここでは、フォールディング処理されるものと、フォールディング処理されないものを結論付けできます。

同様に、SQL の診断で生成された特定の最終的なクエリを見てみると、少し異なる結果が表示されています。

    count(1) as [Count]
from 
(
    select [_].[Country]
    from [dbo].[Customers] as [_]
    where [_].[ContactTitle] = 'Sales Representative' and [_].[ContactTitle] is not null
) as [rows]
group by [Country]

ここでは、Power Query によって、ContactTitle が "Sales Representative" にフィルター処理されたサブ選択が作成され、次にこのサブ選択上で Country 別にグループ化されていることが確認できます。 すべての操作がフォールディング処理されます。

クエリ診断を使用すると、今後、どのような種類の操作がフォールディング処理されるかを調べることができます。Microsoft では、今後、この機能をより使いやすくしたいと考えています。