Record.FieldValuesとRecord.ToListを比べてみた|Power Query


全く同じにしか見えない二つの関数について調べた行きがかり上、記事にしました。
やはり違いは見出せないです・・・。

元となるレコード

大小、データ型などばらばらにしてみる。

RecordSource
let
    Source = [A=10,C=3,G=Json.FromValue({1..100}),B=1,E={1..20},F=[],D=11]
in
    Source

↓プレビューの様子

テストするためのクエリ

Record.FieldValues

ログ出力をかませてありますが、なくても関係なさそうです。

Values
let
    Source = RecordSource,
    Custom3 = Diagnostics.Trace(TraceLevel.Information,
                                "Execute_FiledValues",//自由に出力したい文字列を書ける。
                                ()=> Record.FieldValues(Source),//とにかく、関数の形にすればよい。
                                true
              )
in
    Custom3

Record.ToList

構造は同様。

ToList
let
    Source = RecordSource,
    Custom2 = Diagnostics.Trace(TraceLevel.Information,
                                "Execute_ToList",
                                ()=>Record.ToList(Source),true
              )
in
    Custom2

単純出力結果

同じなわけです。

実行時間

診断機能で6回ログを取り、その平均値を求めてみました。
1回で2クエリを更新するため、前半3回と後半3回とで、クエリの更新順序は入れ替えました。

Power BIの診断機能を準備する

管理者としての実行で、Power BIを起動します。

↓実行すると、こんな具合にログを読むクエリが自動で作られる。(1回で2つのクエリができる)

結果を抽出したクエリ

当初は自動生成されるクエリを#sectionを使って、集計すればいいかな、と思ったんですが、Power BIのデータモデルにロードできませんでした。
なので、自分で集計するクエリを書きました。Jsonファイルもきれいで、技術的には新しいものはないですね。

let
    InFolder =Folder.Files(ログフォルダ),
    #"Filtered Rows" = Table.SelectRows(InFolder, each ([Extension] = ".json")),
    //診断の都度、Jsonが3種類作成されるが、そのうちの1個でいいので名前を絞り込み。
    #"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each Text.StartsWith([Name], "Diagnostics_Aggregated")),
    #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows1",{"Content", "Date created"}),
    #"Added Custom" = Table.AddColumn(#"Removed Other Columns", "JSON変換後", each 
                                        Table.FromRecords(Json.Document([Content]))
                      ),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Content"}),
    //combineでないので、各データのテーブル列名を統合しておきました。
    Names =List.Distinct(
                List.Combine(
                    List.Transform(#"Removed Columns"[JSON変換後],Table.ColumnNames)
                )
           ),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Removed Columns", "JSON変換後", Names, Names),
    //実施日が一緒なので、時刻だけを取る。
    #"Extracted Time" = Table.TransformColumns(#"Expanded {0}",{{"Date created", DateTime.Time, type time}}),
    //集計前にデータ型を規定する。
    #"Changed Type" = Table.TransformColumnTypes(#"Extracted Time",{{"ExclusiveDuration", type duration}}),
    //
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Date created", "Query", "Step"}, {
                            {"合計秒数", each Duration.Seconds(List.Sum([ExclusiveDuration])),type number}
                     })
in
    #"Grouped Rows"

結果

取れたデータは下記の通り。

Date created Query Step 合計秒数
15:27 Values Custom3 1.096082
15:27 Values Source 0.0166865
15:27 ToList Custom2 0.038083
15:27 ToList Source 0.0280941
15:28 Values Custom3 0.1193354
15:28 Values Source 0.0163969
15:28 ToList Custom2 0.0251825
15:28 ToList Source 0.0152157
15:30 Values Custom3 0.043262
15:30 Values Source 0.022095
15:30 ToList Custom2 0.0362267
15:30 ToList Source 0.0200129
16:41 ToList Custom2 0.0543803
16:41 ToList Source 0.0385302
16:41 Values Custom3 0.0765213
16:41 Values Source 0.0316931
16:43 ToList Custom2 0.065703
16:43 ToList Source 0.0267765
16:43 Values Custom3 0.0298695
16:43 Values Source 0.0240801
16:44 ToList Custom2 0.0478038
16:44 ToList Source 0.0283888
16:44 Values Custom3 0.0465215
16:44 Values Source 0.0247305

レポートで平均を求めると、こんな具合です。

一応、データ数を10万件にして同様のテストしてみましたが、ほぼ同じ。要は差がない。