LoginSignup
2
2

More than 3 years have passed since last update.

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

Posted at

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

元となるレコード

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

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

↓プレビューの様子
image.png

テストするためのクエリ

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

単純出力結果

同じなわけです。
image.png

実行時間

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

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

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

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

結果を抽出したクエリ

当初は自動生成されるクエリを#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

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

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

2
2
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
2
2