Power Query のクエリ プランは、クエリの評価をより適切に表示する機能です。 特定の手順で特定のクエリがフォールドされない理由を判断するのに役立ちます。
この記事では、実際の例を通じて、クエリ プラン機能を使用してクエリの手順を確認する主なユース ケースと潜在的な利点を示します。 この記事で使用する例は、AdventureWorks サンプル データベースからダウンロードできる Azure SQL Server 用の AdventureWorksLT サンプル データベースを使用して作成されました。
注
Power Query のクエリ プラン機能は、Power Query Online でのみ使用できます。
この記事は、クエリ プランを解釈するために推奨される一連の手順に分かれています。 次の手順を実行します。
独自の Power Query Online 環境でクエリを作成するには、次の手順に従います。
Power Query から - データ ソースを選択し、[空のクエリ] を選択します。
空のクエリのスクリプトを次のクエリに置き換えます。
let Source = Sql.Database("servername", "database"), Navigation = Source{[Schema = "Sales", Item = "SalesOrderHeader"]}[Data], #"Removed other columns" = Table.SelectColumns(Navigation, {"SalesOrderID", "OrderDate", "SalesOrderNumber", "PurchaseOrderNumber", "AccountNumber", "CustomerID", "TotalDue"}), #"Filtered rows" = Table.SelectRows(#"Removed other columns", each [TotalDue] > 1000), #"Kept bottom rows" = Table.LastN(#"Filtered rows", 5) in #"Kept bottom rows"
独自の環境の正しい名前で
servername
とdatabase
を変更します。(省略可能)オンプレミス環境のサーバーとデータベースに接続しようとしている場合は、必ずその環境のゲートウェイを構成してください。
[次へ] を選択します。
Power Query エディターで、[接続の 構成 ] を選択し、データ ソースに資格情報を入力します。
注
SQL Server への接続の詳細については、SQL Server データベースを参照してください。
これらの手順を実行すると、クエリは次の図のようになります。
このクエリは SalesOrderHeader テーブルに接続し、 TotalDue 値が 1000 を超える最後の 5 つの注文からいくつかの列を選択します。
注
この記事では、簡略化された例を使用してこの機能を紹介しますが、この記事で説明する概念はすべてのクエリに適用されます。 クエリ プランを読み取る前に、クエリ フォールディングについて十分な知識を持っていることをお勧めします。 クエリ フォールディングの詳細については、「クエリ フォールディングの 基本」を参照してください。
1. クエリ フォールディング インジケーターを確認する
注
このセクションを読む前に、 クエリ フォールディング インジケーターに関する記事を確認することをお勧めします。
このプロセスの最初の手順は、クエリを確認し、クエリ フォールディング インジケーターに細心の注意を払う方法です。 目標は、折りたたまれていないとマークされている手順を確認することです。 その後、クエリ全体を変更することで、これらの変更が完全に単純化されるかどうかを確認できます。
この例では、折りたためることができない唯一のステップは 、下の行を保持することです。これは、 折りたたまれていない ステップ インジケーターを使用して簡単に識別できます。 この手順は、クエリの最後の手順でもあります。
ここでの目標は、このステップを確認し、データ ソースにフォールド バックされるものと、フォールドできないものを把握することです。
2. クエリ ステップを選択してクエリ プランを確認する
[保持された下位の行] ステップが、データ ソースにフォールドされないため、関心のあるステップであることがわかりました。 ステップを右クリックし、[ クエリ プランの表示 ] オプションを選択します。 このアクションでは、選択したステップのクエリ プランのダイアグラムを含む新しいダイアログが表示されます。
Power Query では、「クエリ フォールディングの基本」で説明されているように、遅延評価とクエリ フォールディングを利用してクエリを最適化しようとします。 このクエリ プランは、データ ソースに送信されるネイティブ クエリへの M クエリの最適化された変換を表します。 また、Power Query エンジンによって実行されるすべての変換も含まれます。 ノードが表示される順序は、クエリの最後のステップまたは出力から始まるクエリの順序に従います。これは図の左端に表示されます。 この場合、下の行を保持するステップを表す Table.LastN ノードです。
ダイアログの下部には、クエリ プラン ビューの拡大または縮小に役立つアイコンを含むバーと、ビューの管理に役立つその他のボタンがあります。 前の画像では、このバーの [表示に合わせる] オプションを使用してノードの理解を深めていました。
注
クエリ プランは、最適化されたプランを表します。 エンジンはクエリを評価するときに、すべての演算子をデータ ソースに折りたたもうとします。 場合によっては、折りたたみを最大化するために、ステップの内部的な並べ替えを行う場合もあります。 このプロセスを念頭に置いて、この最適化されたクエリ プランに残されたノード/演算子には、通常、"フォールド" データ ソース クエリが含まれます。 折りたたむことができなかった演算子は、ローカルで評価されます。
他のノードから折りたたまれたノードを識別する
この図のノードは、次の 2 つのグループとして識別できます。
- フォールド ノード: このノードは、
Value.NativeQuery
ノードまたは "データ ソース" ノード (Sql.Database
など) のいずれかになります。 これらのノードは、関数名の下の ラベル remote で識別することもできます。 - 非フォールド ノード:
Table.SelectRows
、Table.SelectColumns
、折りたたむことができなかったその他の関数など、他のテーブル演算子。 これらのノードは、 フル スキャン と ストリーミングというラベルで識別することもできます。
次の図は、赤い四角形内の折りたたまれたノードを示しています。 残りのノードをデータソースに戻すことができませんでした。 目標は、それらのノードをデータ ソースに折り返そうとするため、残りのノードを確認する必要があります。
一部のノードの下部にある [ 詳細の表示 ] を選択すると、拡張情報を表示できます。 たとえば、
Value.NativeQuery
ノードの詳細には、データ ソースに送信されるネイティブ クエリ (SQL) が表示されます。
ここに示すクエリは、データ ソースに送信されるクエリとまったく同じではない可能性がありますが、適切な近似値です。 このケースでは、SalesOrderHeader テーブルからどの列が照会されているかを正確に示しています。 次に、TotalDue フィールドを使用してそのテーブルをフィルター処理して、そのフィールドの値が 1000 を超える行のみを取得する方法について説明します。 横のノード Table.LastN は、折りたためることができないため、Power Query エンジンによってローカルに計算されます。
注
演算子は、クエリのスクリプトで使用される関数と正確に一致しない可能性があります。
フォールドされないノードを確認し、変換をフォールドするためのアクションを検討する
これで、どのノードを折りたためず、ローカルで評価できるかを決定できました。 この場合、 Table.LastN
ノードのみが含まれますが、他のシナリオではさらに多くのノードが含まれる場合があります。
目標は、ステップを折りたたむことができるように、クエリに変更を適用することです。 実装する可能性のある変更の一部は、手順の並べ替えから、データ ソースに対してより明示的な代替ロジックをクエリに適用することまで多岐に及びます。 これは、一部の変更を適用することで、すべてのクエリとすべての操作が折りたたみ可能であることを意味するわけではありません。 ただし、クエリを折り返すことができるかどうかを、試行錯誤によって判断することをお勧めします。
データ ソースは SQL Server データベースであるため、目標がテーブルから最後の 5 つの注文を取得する場合は、SQL の TOP 句と ORDER BY 句を利用することをお勧めします。 SQL には BOTTOM 句がないため、PowerQuery の Table.LastN
変換を SQL に変換することはできません。 Table.LastN
の手順を削除し、次のように置き換えることができます。
- SalesOrderID 列に基づいてテーブルを降順で並べ替えるステップです。なぜなら、この列はどの注文が最初に来るか、そしてどの注文が最後に入力されたかを決定するからです。
- テーブルが並べ替えられた後の上位 5 行を選択すると、この変換は、保持された下位行 (
Table.LastN
) の場合と同じように実行されます。
この代替方法は、元のクエリと同じです。 理論的にはこの代替手段は良いようですが、この代替手段によってこのノードがデータ ソースに完全に折り返されるかどうかを確認するために変更を加える必要があります。
3. クエリに変更を実装する
前のセクションで説明した代替手段を実装します。
クエリ プラン ダイアログを閉じて、Power Query エディターに戻ります。
[下の行を保持する] ステップを削除します。
SalesOrderID 列を降順に並べ替えます。
データ プレビュー ビューの左上隅にあるテーブル アイコンを選択し、上部の行を保持するオプションを選択します。 ダイアログで、引数として数値 5 を渡し、[OK] をクリックします。
変更を実装した後、クエリの折りたたみインジケーターをもう一度確認し、折りたたまれたインジケーターが表示されているかどうかを確認します。
次に、最後の手順のクエリ プランを確認します。ここで、 上位の行を保持します。 これで、折りたたまれたノードのみが存在します。
Value.NativeQuery
の下にある [詳細の表示] を選択して、データベースに送信されるクエリを確認します。
この記事では、適用する代替手段を提案していますが、主な目的は、クエリ プランを使用してクエリ フォールディングを調査する方法を学習することです。 また、この記事では、データ ソースに送信される内容と、ローカルで実行される変換の可視性も提供します。
コードを調整して、クエリに与える影響を確認できます。 クエリ折りたたみインジケーターを使用すると、クエリの折りたたみを妨げているステップをよりよく理解できます。