見出し画像

Salesforceで大量データーに対するクエリ

Salesforce DBに保存されている大量データ(LDV: Large Data Volume)に対するSOQLクエリについてまとめてみます。
各所で繰り返し説明されていることのため、新しい情報はないかもしれません。

選択的(Selective)にする

大量データに対するクエリは選択性(Selective)を意識することが必要である。詳しくはヘルプを見てもらいたいのだが、選択的であるとはインデックスが使われるクエリを書くことである。

標準インデックスを使ったクエリ

  • プライマリーキー(Id、Name、OwnerId)

  • 外部キー(CreatedById、LastModifiedById、ルックアップ、主従関係)

  • 監査項目(CreatedDate、SystemModstamp)

  • 一意または外部IDとしてマークされたカスタム項目

標準インデックスのしきい値は、以下である。

  • 最初の100万ターゲットレコードの30%

  • 最初の100万レコードの後はすべてのレコードの15%

  • 100万ターゲットレコードが上限

560万以上のレコードがある場合に上限に達する。

560万レコードがある場合で計算してみると、
100万レコードの30%=300,000
残り460万レコードの15%=690,000
合計990,000レコードでおよそ100万レコードの上限に達します。

カスタムインデックスを使ったクエリ

カスタムインデックスはSalesforceのサポートにお問い合わせして追加してもらう必要がある。カスタムインデックスのしきい値は以下である。

  • 最初の100万ターゲットレコードの10%

  • 最初の100万レコードの後はすべてのレコードの5%

  • 333,333ターゲットレコードが上限

カスタムインデックスも標準インデックスと同様に560万以上のレコードが上限に設定されている。

100万レコードの10%=100,000
残り460万レコードの5%=230,000
合計330,000レコードでおよそ333,333万レコードの上限に達します。

インデックスを使っているかどうかの確認

開発者コンソールのクエリプランを使うと、クエリでインデックスが使われているかどうかを確認できます。クエリプランは、デフォルトでは無効になっているため、以下の手順で有効化する。
1. [開発者コンソール]で[Help] - [Preference]をクリックする
2. [Enable Query Plan]がfalseになっているので、チェックをつけてtrueにして[Save]をクリックする

Preference - Enable Query Planをtrueにして[Save]をクリックする

2. [Query Editor]の[Execute]の隣に[Query Plan]ボタンが表示されるので、SOQLを書いて、[Query Plan]をクリックすると、クエリを実行したときのクエリプランが表示される

[Query Plan]ボタンが表示されてクエリプランが確認できる

Taskオブジェクトへのクエリの例を見てみよう。

Taskオブジェクトへのクエリプラン

この例では、Indexが使用されるクエリが実行されているが、TableScanのほうがコストが低いため、こちらが選択される。

スキニーテーブル(Skinny Table)

カスタムインデックスでは解決できないパフォーマンス問題を解消するための最終手段として、スキニーテーブルがある。Salesforceのカスタマーサポートにお問い合わせして作成してもらう必要があり、実施したいクエリがスキニーテーブルでしか解決できない場合に作成してもらえる。
スキニーテーブルは、必要な項目だけが登録された小さなコピーで、必要な項目(100列まで)に絞られているため、パフォーマンスの改善が見込めるものである。また、ソフト削除されているレコードも含まれていない。

スキニーテーブルの詳細はこちらを参照してほしい。

この記事が気に入ったらサポートをしてみませんか?