tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Salesforceでの大規模データの取り扱いについて

先日、Salesforceでの大規模データの取り扱いWebinarを見ました。
今回のWebinarでは、どう設計すれば大規模データを上手に取り扱いできるかということについてお話が聞けました。

Salesforceで扱えるデータ量

  • Salesforceは扱えるデータに上限がない。
  • ライセンス次第で億単位のデータが扱える。
  • ただし、設計がしっかりしている必要がある。

ベストプラクティス

  • デザイン
  • ロード
  • コンフィグ
  • メンテナンス

この4つが要点になるとのことです。

デザインのベストプラクティス

  • 要件を認識する
  • データの増加量を想定する
  • データのボリュームを最小化する
  • 効率的なオペレーションをデザインする
  • 効率的な共有モデルを適用する
要件を認識する

適切なデータ量を認識しましょうというお話です。
扱いきれない程のデータを1ページにまとめて出すのでは無く適切な件数だけ表示することで効率よくデータにアクセスできます。
ただし、毎回ページの切替が必要になるようだと使いづらい機能になってしまうので適切な件数を表示するようにします。

データの増加量を想定する

最初は少ないデータでも使用していく内にどんどん増加していきます。
データが増加していくことで、最初問題なくても処理に時間がかかるようになってしまいます。
それを防ぐために、データがどのタイミングでどの程度増えるかきちんと認識して対処する必要があるというお話です。

たとえば、不要になったデータを削除する。削除しただけではゴミ箱に残っているため、ハードデリート等で完全に削除を行うことでデータ数を減らすことができます。

効率的なオペレーションをデザインする

クエリを実行する際にもただ実行するのではなく、インデックスを考慮することで効率よくデータを取得できます。
インデックスとは、ID項目やName項目等の特定の項目や外部ID項目に付与されています。
また、通常はついていない項目でも申請することで後から項目を付けることも可能のようです。

インデックス有りと無しではクエリの実行時間に大きく差がでます。
有り:12秒
無し:450秒
※約50万件のレコードで検証時。

効率的な共有モデルを適用する

複雑な共有ルールが設定されていたりすると処理に時間がかかるので、出来る限りシンプルにするといいとのことです。

データロード時のベストプラクティス

  • 整形済みのデータをロードする
  • BulkAPIを利用する
  • APIをつかったロードユーティリティを検討する
  • トリガー、検証ルール、ワークフローを無効化する
  • 共有ルールの適用を延期する

大量のデータを登録する際に効率よく登録するにはどうすれば良いかというお話でした。
トリガー等が有効化されていると登録時に処理が実行されるのでデータ件数が多ければ多い程、登録に時間がかかります。
それを防ぐためにトリガー、検証ルール、ワークフローを無効化します。
無効化するとトリガー等の処理でデータが更新されなくなるので、事前に更新後のデータを用意してから登録します。こうすることで無効化していても正常なデータが登録されるようにします。

トリガーの無効化はテストクラス等の問題もあるため、通常の方法で無効化するのは難しいとのことです。
対応方法としては、カスタム表示ラベルやカスタム設定などに、トリガーの有効・無効フラグを用意し、それを切り替えることで無効にする方法が良いみたいです。

ただし、管理パッケージに含まれるトリガーについては、無効に切り替えるのは難しいとのことです。

コンフィグのベストプラクティス

  • 可能であればデータは公開で利用する
  • ロール階層を最適化して利用する
  • 歪なデータ構造を避ける
  • レコードロックの罠を最小限にする

複雑な階層構造だとより多くの時間が共有の計算にかかるとのことです。
できるかぎりシンプルな構造にすることが大切みたいです。
階層は10以下にまとめることが望ましいみたいです。

メンテナンスベストプラクティス

  • Salesforceのデータベースについて特性を知る
  • 履歴データをアーカイブする
  • アーカイブしたデータはハードデリートする
  • 外部アプリケーション(Heroku等)を分析に利用する
  • Force.com Canvas等を利用してUIでインテグレーションする

Salesforceのデータの特性として、生きたデータを管理するのに向いているとのことです。
使い終わった過去のデータなどはSalseforceとは別のストレージで管理してHeroku等でアクセスするようにすると、Salesforce上のデータを少なくできます。
Force.com Canvasを利用すると別のストレージで管理しているデータにもシームレスにアクセスが可能になります。

まとめ

だいたいこんな感じだったと思います。
個人的には履歴データをHerokuで管理するというのが面白そうだと思いました。
HerokuとSalseforceの連携なんかもできるようになりたいです。

参考サイト

Salesforceでの大規模データの取り扱い

http://www.slideshare.net/DeveloperForceJapan/jp-extreme-salesforce-datavolumes

Salesforceでの大規模データの取り扱い(動画)

http://youtu.be/-pXSJvNjEaQ

Cheat Sheet

http://goo.gl/GsH36