こんにちは、にいるです。
Data Architecture and Management デザイナー試験に絡んだ「インデックス項目」について、まとめています。
デベロッパーか何かの管理者試験でもインデックス項目は出てきたような気がしますが、今回の試験では大本命なのでちゃんとまとめておきます。
・【ヘルプ】インデックス
・【ヘルプ】クエリプランツールの FAQ
1.インデックス項目の仕組み
クエリを最適化するために使用される機能です。
インデックスが付与される項目をクエリの条件に使用することで、セレクティブSOQLクエリになり、検索がより効率的になります。
インデックスが付与される項目は事前に決まっていて、すでに定義されているインデックスのことを標準インデックスと呼びます。
もしインデックスをカスタムで付与したい場合はSalesforceサポートに依頼する必要があります。
後者で作成されたインデックスのことをカスタムインデックスと呼びます。
それぞれ個別にみていきます。
2.標準インデックス
まず標準インデックスは最初からそれぞれのオブジェクトの項目に付与されているインデックスです。
付与されるものは以下です。
# | 項目名 |
1 | RecordTypeId |
2 | Division |
3 | CreatedDate |
4 | Systemmodstamp (LastModifiedDate) |
5 | Name |
6 | Email (取引先責任者とリード) |
7 | 外部キーリレーション (参照と主従関係) |
8 | 各オブジェクトの主キーである、一意の Salesforce レコード ID |
SOQLをセレクティブクエリにする第一条件として、これらの項目をSOQLのWHERE句に使用することが必要です。
次にクエリの検索結果の対象とするレコード数がターゲット内にあるかどうかも必要になります。
図にまとめてみました。
③のしきい値は1,000,000件です。
どういう計算かというと、、、
対象件数の最初の100万件の30%と100万件以降の15%を合計した件数が1,000,000未満ならセレクティブクエリになります。
イメージとしては、ユーザが実行するクエリの前に、システムがセレクティブクエリかどうかの判定を行っているイメージですね。
3.カスタムインデックス
まず、カスタムインデックスですが、これはSalesforceに依頼しないと使用できません。
依頼方法はケース登録らしいので、依頼する方は下記からできると思います。
・【ヘルプ】カスタムインデックスが必要な場合の依頼方法について
カスタムインデックスを使用した場合も標準インデックスと仕様は同じです。
ただWHERE句に入れる項目はSalesforceに依頼することで、自由に設定できるようになります。
WHERE句に項目を指定することと、対象件数がしきい値内かどうかがキーになります。
ただしきい値は標準インデックスより下がるので、制限が少し厳しくなります。
この図でいうと③のしきい値が333,333件内かどうかです。
(上記と同じ図です。)
また、ANDやOR、LIKEをフィルタ条件として使用する場合、しきい値が変更されます。
ANDであれば666,666件内、ORなら333,333件、LIKEだと100,000件です。
ただ、この辺はややこしいので本当にセレクティブかどうかはクエリプランツールでちゃんとSOQLを確認したほうがいいですね。
4.インデックス使用時の注意事項
4-1.セレクティブクエリにならない例外
インデックス項目を使用して、検索結果件数がしきい値内でも例外としてセレクティブクエリでない場合があります。
- !=、NOT CONTAINS、EXCLUDESといった否定演算子を使用した条件。
- NULLとの比較している(標準インデックスの場合)
- 比較演算子(<,>,<=,>=)を使用した範囲検索
この点も予め踏まえてクエリを書いた方がいいですね。
4-2.インデックスを設定できない項目
カスタムでインデックスを設定できない項目です。
- Lightning Platform でインデックス付けできない項目の参照
- 複数選択リスト
- マルチ通貨組織の通貨項目
- ロングテキストエリア項目
- バイナリ項目 (blob、ファイル、または暗号化されたテキスト)
ただ標準項目でも特殊なものには設定できないようです。
- 商談:Amount、TotalOpportunityQuantity、ExpectedRevenue、IsClosed、IsWon
- ケース:ClosedDate、IsClosed
- 商品:ProductFamily、IsActive、IsArchived
- ソリューション:Status
- リード:Status
- 活動:Subject、TaskStatus、TaskPriority
5.クエリプランツールの使い方
最後にクエリプランツールの使い方をまとめておきます。
色々な制約があるので、それらの制約を考慮して作っても「実はセレクティブクエリになっていない」ってこともあり得ます。
それを回避するためにクエリプランツールを使用して、セレクティブクエリかどうかを判定できます。
開発者コンソールの[Help]→[Preferences]→[Enable Query Plan (クエリプランを有効化)] をTrueにするだけです。
次にQuery Editorでクエリを実行して、[Query Plan]をクリックします。
こちらはセレクティブクエリになっているクエリです。
1 |
SELECT Id FROM Lead WHERE Email ='savepo@savepo.com' |
こちらはセレクティブクエリになっていないクエリです。
1 |
SELECT Id FROM Lead WHERE Email !='savepo@savepo.com' |
Indexはインデックスが適用されていて、TableScanはすべてのレコードに対してクエリしているステータスを表しています。
インデックスが作成されていないため、最適化のためのフィルターを考慮していません。 表:リードフィールド:[“IsDeleted”] 演算子は最適化できず、フィルターは所有者が最適化できないため、最適化のためのフィルターを考慮していません。 表:リードフィールド:[“Eメール”] という意味みたいです。
6.まとめ
いかがでしたでしょうか。
参考記事探してもなかなか出てこなく、結構理解に苦しみました。笑
なので、誤認している箇所もあるかもしれませんので、おおよそこんなイメージですと思っていただければ。
しきい値もちょっとややこしくドキュメントも字面しかないので、敬遠しそうな機能ですよね。
でも開発者は必要な知識なので、機能としきい値を正確に把握しておかないといけないですね。
Salesforceは本当に覚えることが多いですね笑
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!
コメント