2015年7月のアップデートで1度に取得できるレコード数が100件から500件に拡張されたレコード一括取得APIですが、文字通り1度に取得できる件数が5倍になりますので、リクエストのコール回数が1/5になるのは分かります。ここでもうひとつ気になることが、処理時間としての性能がどれだけ上がるのかということです。オーバーヘッド等あるとして1/5になるのは過剰な期待だと思いますが、確認してみましょう。

 

レコード全件取得によるケーススタディ

今回はkintone Café 東京 Vol.4のハンズオンで利用したアプリ(21項目、41,188レコード)のレコード取得をJavaScriptによる単純取得とコマンドラインツールによるCSV出力で、limitが100件と500件の時をそれぞれ比較してみたいと思います。13インチMacBook Airで実行します。

 

JavaScriptによる全件取得

JavaScriptによるレコード全件取得は次のコードで、ボタンクリックをトリガーに実行し、その所要時間を console.time/timeEnd で計測します。

/*
* dependencies: https://js.cybozu.com/jquery/1.11.3/jquery.min.js
*/
(function() {
  "use strict";

  kintone.events.on(['app.record.index.show', 'app.record.detail.show'], function(event) {
    if (!$('#timer')[0]) {
      var el;
      if (kintone.app.getHeaderMenuSpaceElement()) {
        el = kintone.app.getHeaderMenuSpaceElement();
      } else {
        el = kintone.app.record.getHeaderMenuSpaceElement();
      }
      $(el).append(
        $('<button>').prop('id', 'timer').html('全件取得')
      );
    }

    $('#timer').click(function() {
      var app_id = kintone.app.getId();
      var condition = '';
      var limit = 500;
      var offset = 0;

      console.time('kintone');
      getRecords(app_id, condition, limit, offset, function(resp) {
        console.timeEnd('kintone');
        alert('全てのレコードを取得しました(' + resp.records.length + '件)');
      }, function(err_resp) {
        console.timeEnd('kintone');
        alert('レコード取得時にエラーが発生しました');
      });
    });
    return event;
  });

  function getRecords(app_id, condition, lmt, ofs, callback, errback, data) {
    var limit_num = (lmt === undefined) ? 100 : lmt;
    var limit = ' limit ' + limit_num;
    var offset = (ofs === undefined) ? '' : ' offset ' + ofs;
    var query = condition + limit + offset;
    if (!data) {
      var data = {
        records: []
      };
    }
    kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
      app: app_id,
      query: query,
    }, function(resp) {
      data.records = data.records.concat(resp.records);
      if (resp.records.length < limit_num) {
        callback(data);
      } else {
        ofs = parseInt(ofs) + resp.records.length;
        getRecords(app_id, condition, limit_num, ofs, callback, errback, data);
      }
    }, errback);
  }
})();

 

コマンドラインツールによる全件取得

次のようにCSV出力の時間を計測します。なお、執筆時点でコマンドラインツールは100件取得ベースとなっていましたので、500件取得の用は独自にリビルドしました。計測値はrealを採用します。

time ./cli-kintone -a 10 -d kintone-cafe-tokyo-4 -t MsCgUh96ln8I94AnnIdJRDIyvbRfpql0sakQtKE8 > data.csv

 

結果と考察

3回実行した平均実行時間をまとめることにします。

全レコード数が500件の時

limit 100 (×5コール) limit 500 (×1コール)
JavaScript 0m3.022s 0m2.013s
コマンドラインツール 0m2.859s 0m1.569s

全レコード数が41,188件の時

limit 100 (×412コール) limit 500 (×83コール)
JavaScript 3m47s 2m09s
コマンドラインツール 2m34s 1m54s

見てみると、単純に1/5とは行きませんでしたが、JavaScriptでもコマンドラインツールでも500件取得(limit 500の繰り返し)の方が速い結果となりました。

項目数やレコード数にも寄るかもしれませんが、コール数だけでなく実行時間でも優位性があるlimit 500を使うほうがお得と言えそうです!

おまけ

ちなみに、この検証今頃やった理由ですが・・・、kintone Café 東京 Vol.4のハンズオンでAmazon Machine Learningへの連携を試みましたが、この際kintoneのデータをS3にCSVで入れる必要がありました。思い立ったのが、コマンドラインツールをLambda + API GatewayでキックしてS3にCSVをPUTするという方法でしたが、Lambdaがどうしてもタイムアウトになるので、どのくらい時間がかかってるのか確かめてみようというところからでした。Lambdaのタイムアウトは現在60sですので、41,188レコードの取得のためには全然足りていないということで、kintoneから普通にCSVダウンロードして、AWSのダッシュボードから普通にS3にアップロードするシナリオとなりました。

 


株式会社ジョイゾー