Slide 1

Slide 1 text

@GetDocField の処方箋 パフォーマンス小噺 中野晴幸 @harunakano (Twitter) [email protected] (blog)

Slide 2

Slide 2 text

@GetDocField とは • 文書の UNID とフィールド名を指定して実行すると、対象の文 書にあるフィールドの値を返す 値: テキスト、テキストリスト、数値、数値リスト、日時、日時範囲 構文) @GetDocField( documentUNID ; fieldName ) 例) @GetDocField( $Ref; ”Subject” )

Slide 3

Slide 3 text

ポイント • 設計要素が不要(@DbLookup はビューが必要) • 親文書の参照が容易($Ref を使用)

Slide 4

Slide 4 text

ポイント • 他のDBを参照できない • UNIDはハードコード可能だが参照先の特定を困難にする • 多用はパフォーマンスに悪影響を及ぼす可能性あり

Slide 5

Slide 5 text

注意点(1) • 参照する文書の全テキストフィールドを受信してしまう ➢指定したフィールドの値だけ受信するためのオプションは存在しない ➢指定したフィールドの値が1バイトの場合、関数の戻り値は1バイトだ がNRPCコマンドで受信するデータのサイズは指定していないテキス トフィールドを含めたものになる ➢指定するフィールドは違ってもUNIDが同じ場合、NRPCコマンドで受 信するデータのサイズは同じになる

Slide 6

Slide 6 text

注意点(2) • NRPCコマンドはフィールドの数だけ発行される ➢受信データをクライアント側で明示的にキャッシュするオプションは 存在しない ➢@GetDocField が100個のフィールドにある場合、NRPCコマンドが 100回発行される

Slide 7

Slide 7 text

パフォーマンスへの影響 • 遅延の大きいネットワークではNRPCコマンド発行の回数を削 減することでパフォーマンスが高まる • 「ネットワークデータの圧縮」の有効化で受信データのサイズ は激減するため狭帯域ネットワークではパフォーマンスが高ま る可能性はあるが、NRPCコマンド実行時間への貢献は少ない • クライアント側にキャッシュのオプションは無いが、メモリ内 にある受信データを再利用するコツがあり、再利用することで NRPCコマンドの発行回数を削減できた

Slide 8

Slide 8 text

パフォーマンスへの影響 • 返答文書を開くのに待たされた実例 ➢社内LAN上の Domino にあるDB:< 1 秒 ➢クラウド上の Domino にあるDB:> 20 秒

Slide 9

Slide 9 text

「1命令×61フィールド」 vs 「61命令×1フィールド」 メモリ内にある受信データを再利用するコツ

Slide 10

Slide 10 text

クラウド上の Domino にあるアプリ

Slide 11

Slide 11 text

2つの文書(親と子)

Slide 12

Slide 12 text

子文書が参照する親文書 文書サイズ: 32299 バイト アイテム名 サイズ bigItem 32000 バイト Body 150 バイト Form 9 バイト Subject 36 バイト

Slide 13

Slide 13 text

2つの返答フォーム デモではこの2つの フォームのうち一方の別名を “Reply” に変えて使用します どちらのフォームも @GetDocField($Ref; “Subject”) を61回実行します

Slide 14

Slide 14 text

「1命令×61フィールド」のフォーム 1つの @GetDocField を 表示用の計算結果の式にセット そのフィールドを60個コピー

Slide 15

Slide 15 text

「61命令×1フィールド」のフォーム @ThisValue を 表示用の計算結果の式にセット そのフィールドを60個コピー temp フィールドの式で 各フィールドへ @GetDocField の結果をセット

Slide 16

Slide 16 text

【参考】 NRPC コマンドのログを記録する • クライアントの notes.ini へ次の3行を追加 CLIENT_CLOCK=1 CONSOLE_LOG_ENABLED=1 DEBUG_THREADID=1 ログがデータディレクトリの IBM_TECHNICAL_SUPPORT フォルダにある console.log に記録される

Slide 17

Slide 17 text

【参考】 @GetDocField 実行時のNRPCコマンド OPEN_NOTE_UNIDNAME_RQST [0934:0002-2098] (1142-46528 [1383]) OPEN_NOTE_UNIDNAME_RQST(REP492587B4:002743AD- UNIDED7FB824:844179CF-492587B3:004126DE,03400000): 510 ms. [82+32652=32734] このコマンド名のある行数と 行の右端にある NRPCコマンドの実行時間 に注目します

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

【参考】 NRPCコマンド発行回数と実行時間合計 1命令 x 61フィールド NRPCコマンド発行回数: • 61回 実行時間合計: • 10033 ms (平均 164.5 ms) 61命令 x 1フィールド NRPCコマンド発行回数: • 1回 実行時間合計: • 165 ms

Slide 20

Slide 20 text

複数の @GetDocField は1つのフィール ドにまとめてパフォーマンスアップ!! • メモリ内のデータが再利用される条件 ➢@GetDocField が同じフィールドの式にある ➢UNID が同じ • カスタマサポートはこの方法がNRPCコマンド実行回数を削減 する方法としてサポートされることを明言しました。「しかし ながら、これは現在の設計思想であり、今後、パフォーマンス 上の改善などの設計変更によっては、その挙動が変更となる可 能性もあります事に、ご注意ください。」とも。