エディタを眺めていると [適用したステップ] ごとで処理されているように見える。Mashup engine がよしなに対応してくれるから、多くの場合で気にすることはないかもしれない。ただ、[適用したステップ] ごとに処理されるということを期待したままでガチャガチャやったところでうまくいくはずはないし、ステップ数を減らした記述をしたからってパフォーマンスが良くなるということもないし、逆効果ということまである。
最適化やチューニングを施したいなら、動作やスペックについて深い理解が必要だ。Power Query は Excel でもないしリレーショナルデータベースでもない。だから、それらの知恵/知識で考えたロジックが Power Query では通用しないってことは普通の出来事。
たとえば
テーブルに対する変換多くについては行ごとで処理される。たとえば、テーブルにいくつかの列を追加するとき複数のステップが同時に処理されるということになる。ストリーミングによる処理を実施できるのであれば、[適用するステップ]ごとでではなく、おまとめされた処理になる。
後続するステップであってもストリーミングで処理される。
// Query1
let
Source = Table.FromColumns(
{
List.Numbers(1, Number.PositiveInfinity)
},
type table [Column1 = Int64.Type]
),
FirstRows_le5 = Table.FirstN(Source, each [Column1] <= 5)
in
FirstRows_le5
Source: 無限行数のテーブル
FirstRows_5: 先頭5行のみ選択
Source が無限行のテーブルを結果するからといって、いきなりエラーになることはない。次の[適用するステップ]にある、Table.FirstN もストリーミング処理に含まれるから。
- Source から1行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
- Source から2行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
- Source から3行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
- Source から4行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
- Source から5行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
- Source から6行目 ⇒ FirstRows_le5 の [Column1] <= 5 は false
行ごとの処理(ストリーミング)は行数分 6 回繰り返し、7 行目以降の処理は発生しない。
ストリーミングという動作では、[適用するステップ]ごとに先行評価をしないということだ。
テーブルではなくリストでも同じ。
思ったこと🙄
ほとんどのクエリで[適用したステップ]の順序で処理されない。
ステップごとで先行評価しないストリーミングは全体計算量を大きく減らす手段である。
そして、結果に必要のない処理をしないという判断も可能なのだ。
その他