Salesforceで大量データーに対するクエリ
Salesforce DBに保存されている大量データ(LDV: Large Data Volume)に対するSOQLクエリについてまとめてみます。
各所で繰り返し説明されていることのため、新しい情報はないかもしれません。
選択的(Selective)にする
大量データに対するクエリは選択性(Selective)を意識することが必要である。詳しくはヘルプを見てもらいたいのだが、選択的であるとはインデックスが使われるクエリを書くことである。
標準インデックスを使ったクエリ
プライマリーキー(Id、Name、OwnerId)
外部キー(CreatedById、LastModifiedById、ルックアップ、主従関係)
監査項目(CreatedDate、SystemModstamp)
一意または外部IDとしてマークされたカスタム項目
標準インデックスのしきい値は、以下である。
最初の100万ターゲットレコードの30%
最初の100万レコードの後はすべてのレコードの15%
100万ターゲットレコードが上限
560万以上のレコードがある場合に上限に達する。
カスタムインデックスを使ったクエリ
カスタムインデックスはSalesforceのサポートにお問い合わせして追加してもらう必要がある。カスタムインデックスのしきい値は以下である。
最初の100万ターゲットレコードの10%
最初の100万レコードの後はすべてのレコードの5%
333,333ターゲットレコードが上限
カスタムインデックスも標準インデックスと同様に560万以上のレコードが上限に設定されている。
インデックスを使っているかどうかの確認
開発者コンソールのクエリプランを使うと、クエリでインデックスが使われているかどうかを確認できます。クエリプランは、デフォルトでは無効になっているため、以下の手順で有効化する。
1. [開発者コンソール]で[Help] - [Preference]をクリックする
2. [Enable Query Plan]がfalseになっているので、チェックをつけてtrueにして[Save]をクリックする
2. [Query Editor]の[Execute]の隣に[Query Plan]ボタンが表示されるので、SOQLを書いて、[Query Plan]をクリックすると、クエリを実行したときのクエリプランが表示される
Taskオブジェクトへのクエリの例を見てみよう。
この例では、Indexが使用されるクエリが実行されているが、TableScanのほうがコストが低いため、こちらが選択される。
スキニーテーブル(Skinny Table)
カスタムインデックスでは解決できないパフォーマンス問題を解消するための最終手段として、スキニーテーブルがある。Salesforceのカスタマーサポートにお問い合わせして作成してもらう必要があり、実施したいクエリがスキニーテーブルでしか解決できない場合に作成してもらえる。
スキニーテーブルは、必要な項目だけが登録された小さなコピーで、必要な項目(100列まで)に絞られているため、パフォーマンスの改善が見込めるものである。また、ソフト削除されているレコードも含まれていない。
スキニーテーブルの詳細はこちらを参照してほしい。