今回は久しぶりにパフォーマンスの話になります。
パフォーマンスは大量データを用意しないといけないので検証しづらいんですよね。。。
なので、机上での学習がメインとなりますがご了承ください。
3つの違いわかりますか?
今回のテーマは、ユニークと外部IDとインデックス。
この3つは似ていますが、特徴が微妙に異なります。
ユニーク項目
特徴
- 値の重複ができない
- 必ずしもインデックスとなる訳ではない
- 必須でなければnullを設定することは可能
当然、ユニークなので、値の重複ができないができないのは当たり前ですが、必ずインデックスになる訳ではないので注意してください。
後述するインデックスの条件として、ユニーク項目は条件を満たせますが、サポートに問い合わせないとインデックスが貼れる訳ではないので間違えないように。
外部ID
特徴
外部IDには以下の特徴があります。
- upsertのキーとして使用できる
- サイドバー検索が可能
- インデックスが作成される
- 最大25個まで設定できる
- 必ずしもユニークでなくて良い(非推奨)
おそらく、用途として一番有名なのが、一番上のキー項目でしょう。upsertのキーとして、またインポート時のキーとして使った方も多いかと思います。
上級試験となれば、インデックスにもなるという事を覚えておきましょう。
SOQLのパフォーマンスについても問われるので、検索時間短縮の手段として外部IDによる検索で短縮される事を押さえておきましょう。
外部IDとして設定可能なデータ型
以下のデータ型が外部IDとして設定可能です。
- 自動採番
- メール
- 番号
- テキスト
外部IDは、ユニークでなくても設定ができます。
ただし、ユニークでないと、同じキーが2レコード以上持てる事になり、upsertに失敗する可能性が増えてしまうので、推奨はしていません。
ユニーク項目と併用で使うようにしましょう。
インデックス
- クエリの処理速度を短縮することができる
逆に言うと、これだけが唯一そして最大の特徴です。
インデックスに設定された項目は検索処理において、大きく検索時間を上げることができます。
インデックスとなる項目
インデックスには2種類あり、標準インデックスとカスタムインデックスがあります。
下記の全てがインデックスになり得る訳ではなく、条件を満たさないとインデックスと認められません。
条件を満たさない場合はインデックスが作成されないため、検索時間の向上にはなりません。
それぞれ、検索条件の件数により条件が違います。
標準インデックス
標準インデックスの一致率はこのように定義されています。
条件の一致率が、最初の 100 万件のレコードで 30% 未満、その他のレコードで 15% 未満である場合に使用されます (最大で 100 万件)。
標準インデックスは以下項目に標準で作成されています。
- SalesforceID
- レコードタイプID
- Division
- CreatedDate
- Systemmodstamp (LastModifiedDate)
- Name
- Email (取引先責任者とリード)
- 参照項目、主従関係
カスタムインデックス
カスタムインデックスの一致率はこのように定義されています。
検索条件が合計レコード数の 10% 未満 (最大で 333,333 件) に一致する場合に使用されます。
標準よりも条件が厳しめになっています。
カスタムインデックスはサポートへの問い合わせにより作成することができ、標準インデックスでサポートされていないnull値も含むことができます。
以下がカスタムインデックスとなり得る項目です。
- 外部ID項目
- サポートに問い合わせした項目(ロングテキストなど一部データ型除く)
SOQLのチューニング
インデックスの設定を行ったとしても、それを活用しないと意味がありません。
うまく高速検索ができるように、SOQL内で最大限の効果を発揮する必要があります。
ちなみに、このインデックスが活用されたSOQLをセレクティブSOQLというそうです。
- インデックス項目の完全一致(イコール、IN)を使用する
- 範囲検索、部分一致は効果が薄い
- リレーション、ソートはパフォーマンスが落ちる
この辺りがチューニングのポイントとなるため、覚えておきましょう。
まとめ
- 外部IDはインデックス項目となり、原則ユニークとして使う
- インデックスされた項目を使用してSOQLを組み立てることで、パフォーマンスが向上できる
コメント