3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power Query workout - 適用したステップごとに処理されるとは限らない

Last updated at Posted at 2023-09-25

エディタを眺めていると [適用したステップ] ごとで処理されているように見える。Mashup engine がよしなに対応してくれるから、多くの場合で気にすることはないかもしれない。ただ、[適用したステップ] ごとに処理されるということを期待したままでガチャガチャやったところでうまくいくはずはないし、ステップ数を減らした記述をしたからってパフォーマンスが良くなるということもないし、逆効果ということまである。

最適化やチューニングを施したいなら、動作やスペックについて深い理解が必要だ。Power Query は Excel でもないしリレーショナルデータベースでもない。だから、それらの知恵/知識で考えたロジックが Power Query では通用しないってことは普通の出来事。

たとえば

テーブルに対する変換多くについては行ごとで処理される。たとえば、テーブルにいくつかの列を追加するとき複数のステップが同時に処理されるということになる。ストリーミングによる処理を実施できるのであれば、[適用するステップ]ごとでではなく、おまとめされた処理になる。

後続するステップであってもストリーミングで処理される。

Power Qeury
// 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 もストリーミング処理に含まれるから。

  1. Source から1行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
  2. Source から2行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
  3. Source から3行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
  4. Source から4行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
  5. Source から5行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true
  6. Source から6行目 ⇒ FirstRows_le5 の [Column1] <= 5 は false

行ごとの処理(ストリーミング)は行数分 6 回繰り返し、7 行目以降の処理は発生しない。
ストリーミングという動作では、[適用するステップ]ごとに先行評価をしないということだ。

テーブルではなくリストでも同じ。

思ったこと🙄

ほとんどのクエリで[適用したステップ]の順序で処理されない。
ステップごとで先行評価しないストリーミングは全体計算量を大きく減らす手段である。
そして、結果に必要のない処理をしないという判断も可能なのだ。

その他

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?