わかったようでわからない、結果が必要になるまで式を評価しないという動作。Lazy evaluation、遅延評価と訳されるのだけど、全体計算量を減らすなどクエリ評価の最適化にはとても重要な動作。
必要になるまで式を評価しないので、不要な評価しないことができる。という評価戦略
たとえば
このクエリは 5行3列のテーブルと評価される。
後続の処理があれば、その処理を含めた評価が行われる。5行3列として先行評価されるわけではない。
// 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
Query1 を参照するクエリで列を選択したとき、
// Query1_A
let
Source = Query1,
RemovedOtherColumns = Table.SelectColumns(Source,{"Column1", "Column3"})
in
RemovedOtherColumns
列 Column2 は必要がないので評価されない。Query1 のステップ AddedColumn2 で Column2 は追加しない動作になる。
Query1 を参照するクエリで行を選択したとき、
// Query1_B
let
Source = Query1,
FilteredRows = Table.SelectRows(Source, each ([Column1] = 3))
in
FilteredRows
Table.SelectRows の行を選択する条件 [Column1] = 3
はすべての行で評価される。
[Column1] = 3
がtrue
になる行のみ、[Column2] と [Column3] は評価され、Query1 のステップ AddedColumn2 と AddedColumn3 で列が追加される動作。行を選択してから列を追加する動作と同じになる。
思ったこと🙄
この動作は "可能な限り" で "常に" ではない。なので、
ベストプラクティスは "できるだけ早いタイミングで不要な行もしくは列を除外すべき" ということだ。
その他