- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-12-2022 07:49 PM
お世話になっております。
以下のQAでご教示いただいた方法でテーブルに添付されたCSVファイルをテーブルへ取り込むスクリプト実行に関して、
大量のレコードを含むCSVファイルを処理するケースの処理時間短縮が検討事項として挙がっております。
※約50万件のデータ取込みに45分程かかっています
スクリプトを使わない方法で処理時間短縮が見込める方法はあるのでしょうか?
変換マップの使用については、結局CSV→テーブルのインポートが必要になり、他のマスタテーブル参照が必要になることで難しいと判断しています。
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-15-2022 03:27 AM
function script(){
//ScheduleJob
gs.info('Test OK');
}
var sched = new ScheduleOnce();
sched.script = '('+script+')();';
sched.schedule();
ScheduleJobをScript includeに保存する話が別でありますが、そうするべき重要な理由があります。
ScheduleJobはUpdateSetに保存されません。これでは開発運用上問題があります。そのためUpdateSetに保存されるScript includeにほぼすべてのScriptを記載して、ScheduleJobは呼び出すだけにするのが開発の運用上、良い方法です。ScheduleJobはXMLファイルで適用するか強制的にUpdateSetに記録する。
Performanceの話も出てますが、今回のケースではほぼ気にならない程度のはずです。50万件をScheduleJobで処理しているときも、動作速度は変わらなかったはずです。その程度のScheduleJobがひとつあるだけなら体感的な影響はほぼなしです。注意しなければならないのは、ScheduleJobの同時に処理できる数は少ないことと、長時間占有すると、順番待ちしているScheduleJobが実行できないだけでなく、順番が来てもとっくに開始時間が過ぎていているため開始しないことがあります。そのためScheduleJobの大量作成と長時間占有には注意して制御するべきです。結果的に夜間に実行することが多いですが夜間に多くのScheduleJobの滞留が発生すると処理できない場合があります。
これら難しい処理を、ServiceNowの知識が乏しい時には、挑戦しない方が良いです。自分の力量を大きく上回る実装は見送る事も大切な事です。出来る範囲でシステムを使って、仕組みがわかってから改良していくことが良いです。良くわからない謎の技術で動いているScriptが完成しても、それは制御できない非常に危険なシステムです。それと自分しかわからない特殊なScriptも危険です。無理しないことが安全です。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-14-2022 12:21 AM
iwai様、ozawa様
スクリプトの問題点について、ご指摘いただきありがとうございます。
現在、ご指摘いただいた点について、見直しをかけているところです。
改善案の1つとして挙がっている並行処理の実装方法について質問させてください。
ジョブスケジュールでイベントを発生させ、スクリプトアクションを呼び出す方法(※)を検討しておりましたが、他に並行処理を行うよい方法がありましたらご教示いただけないでしょうか。
※ジョブスケジュールでsys_attachmentを検索し、添付ファイル名と添付ファイルのsys_idをスクリプトアクションに引き渡し、function getCsvをスクリプトアクションで行う。

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-14-2022 01:54 AM
好みの問題ですが、私でしたらgetCsvをスクリプトインクルードにします。
スクリプトアクション、非同期(async)ビジネスルール、フローデザイナー(parallelフロー)、またはワークフローからそのスクリプトインクルードを呼び出すことが可能です。
参照まで、

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-14-2022 04:15 PM
find_sys_id()とformat_check()を改善するとことで時間を短縮することはできると思います。
昼間で並行実行すると他処理に影響します。特にServiceNowでは定期的にセキュリティパッチやバージョンアップをされます。保守中に並行実行処理が実行されるとメモリ不足やレスポンスが劣化など問題が発生する可能性があります。またバージョンアップするとServiceNowの仕様が変わる可能性があるのでテストします。並行実行するとテストも複雑になります。運用のことも考慮して仕様を決めた方が後で問題が少なくなります。
昼間に実行する場合はAPIを利用してリアルタイムに少数のレコードを処理した方が他処理に影響しません。その場合でも処理時間をスケジュールするよりも処理間隔を設定した方が一時的に多くのレコードを処理することがある場合でも一旦他処理に時間を与えることができるので他処理の影響が少なくなります。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-15-2022 03:27 AM
function script(){
//ScheduleJob
gs.info('Test OK');
}
var sched = new ScheduleOnce();
sched.script = '('+script+')();';
sched.schedule();
ScheduleJobをScript includeに保存する話が別でありますが、そうするべき重要な理由があります。
ScheduleJobはUpdateSetに保存されません。これでは開発運用上問題があります。そのためUpdateSetに保存されるScript includeにほぼすべてのScriptを記載して、ScheduleJobは呼び出すだけにするのが開発の運用上、良い方法です。ScheduleJobはXMLファイルで適用するか強制的にUpdateSetに記録する。
Performanceの話も出てますが、今回のケースではほぼ気にならない程度のはずです。50万件をScheduleJobで処理しているときも、動作速度は変わらなかったはずです。その程度のScheduleJobがひとつあるだけなら体感的な影響はほぼなしです。注意しなければならないのは、ScheduleJobの同時に処理できる数は少ないことと、長時間占有すると、順番待ちしているScheduleJobが実行できないだけでなく、順番が来てもとっくに開始時間が過ぎていているため開始しないことがあります。そのためScheduleJobの大量作成と長時間占有には注意して制御するべきです。結果的に夜間に実行することが多いですが夜間に多くのScheduleJobの滞留が発生すると処理できない場合があります。
これら難しい処理を、ServiceNowの知識が乏しい時には、挑戦しない方が良いです。自分の力量を大きく上回る実装は見送る事も大切な事です。出来る範囲でシステムを使って、仕組みがわかってから改良していくことが良いです。良くわからない謎の技術で動いているScriptが完成しても、それは制御できない非常に危険なシステムです。それと自分しかわからない特殊なScriptも危険です。無理しないことが安全です。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-15-2022 11:10 PM
ozawa様、iwai様
ご返信ありがとうございます。いただいた情報を元に対応方法を検討いたします。
iwi様
ScheduleOnceの使用方法について質問させてください。
一日に一回など、定期的にスクリプトを実行する場合は、ジョブスケジュールに以下のスクリプトを記載し、
sched.schedule();をLoopさせ、ScheduleOnce(中身はgetCsv)を並列処理回数分呼び出すということで合っていますでしょうか?
function script(){
//ScheduleJob
gs.info('Test OK');
}
var sched = new ScheduleOnce();
sched.script = '('+script+')();';
sched.schedule();