6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Power Query workout - 必要になるまで評価しないので、不要な評価をしないということができる

Posted at

わかったようでわからない、結果が必要になるまで式を評価しないという動作。Lazy evaluation、遅延評価と訳されるのだけど、全体計算量を減らすなどクエリ評価の最適化にはとても重要な動作。

必要になるまで式を評価しないので、不要な評価しないことができる。という評価戦略

たとえば

このクエリは 5行3列のテーブルと評価される。
後続の処理があれば、その処理を含めた評価が行われる。5行3列として先行評価されるわけではない。

Power Query
// Query1
let
    Source = Table.FromColumns(
        {
            List.Numbers(1, 5)
        },
        type table [Column1 = Int64.Type]
    ),
    AddedColumn2 = Table.AddColumn(
        Source, "Column2",
        each [Column1] + 10,
        Int64.Type
    ),
    AddedColumn3 = Table.AddColumn(
        AddedColumn2, "Column3",
        each [Column1] * 10,
        Int64.Type
    )
in
    AddedColumn3

image.png

Query1 を参照するクエリで列を選択したとき、

Power Query
// Query1_A
let
    Source = Query1,
    RemovedOtherColumns = Table.SelectColumns(Source,{"Column1", "Column3"})
in
    RemovedOtherColumns

image.png
列 Column2 は必要がないので評価されない。Query1 のステップ AddedColumn2 で Column2 は追加しない動作になる。

Query1 を参照するクエリで行を選択したとき、

Power Query
// Query1_B
let
    Source = Query1,
    FilteredRows = Table.SelectRows(Source, each ([Column1] = 3))
in
    FilteredRows

image.png
Table.SelectRows の行を選択する条件 [Column1] = 3 はすべての行で評価される。
[Column1] = 3trueになる行のみ、[Column2] と [Column3] は評価され、Query1 のステップ AddedColumn2 と AddedColumn3 で列が追加される動作。行を選択してから列を追加する動作と同じになる。

思ったこと🙄

この動作は "可能な限り" で "常に" ではない。なので、
ベストプラクティスは "できるだけ早いタイミングで不要な行もしくは列を除外すべき" ということだ。

その他

6
5
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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?