最近、仕事で何百万ものオブジェクトのデータを取得するという問題に遭遇しました。そのため、SOQLを高速化する方法について調査を行いました。
参考
一般的に、SOQLを高速化する方法は以下いくつかあります。
1.クエリをセレクティブにする
2.不要な項目を取得しない
3.数式項目を取得しない
4.リレーションクエリを使用しない
5.WHERE句に数式項目を使用しない
6.検索結果の件数が少なくなるように条件を設定する
その中に、わかりにくいのは「クエリをセレクティブにする」ことだと思います。
クエリをセレクティブにする
テーブルの完成スキャンではなく、インデックスを使用するようにする(セレクティブなクエリ)と検索が高速になる。
大規模データベースで極めて効果的。
標準インデックス付き項目およびカスタムインデックス付き項目
クエリオプティマイザでは、各インデックスのデータ分配に関する統計情報を含むテーブルが保持されます。
このテーブルを使用して、インデックスを使用することでクエリの処理時間を短縮できるかどうかを判断するために、事前クエリを実行します。
たとえば、取引先オブジェクトに Account_Type という項目があるとします。この項目は、Large、Medium、または Small の値をとることができ、項目にはカスタムインデックスが付けられています。
Salesforce で次のようなクエリが生成されたとします。
SELECT * FROM Account WHERE Account_Type__c = 'Large'
クエリオプティマイザでは、Account_Type 項目の値が Large であるレコードの数を判断するために、内部統計情報テーブルに対して事前クエリが実行されます。この数がオブジェクトの合計レコード数の 10% または 333,333 レコードを超える場合、クエリではカスタムインデックスが使用されません。
標準インデックス付き項目
条件の一致率が、最初の 100 万件のレコードで 30% 未満、その他のレコードで 15% 未満である場合に使用されます (最大で 100 万件)。
たとえば、標準インデックスは次の場合に使用されます。
200 万件のレコードを含むテーブルに対してクエリが実行され、検索条件が 450,000 件以下のレコードに一致する。
500 万件のレコードを含むテーブルに対してクエリが実行され、検索条件が 900,000 件以下のレコードに一致する。
カスタムインデックス付き項目
検索条件が合計レコード数の 10% 未満 (最大で 333,333 件) に一致する場合に使用されます。
たとえば、カスタムインデックスは次の場合に使用されます。
500,000 件のレコードを含むテーブルに対してクエリが実行され、検索条件が 50,000 件以下のレコードに一致する。
500 万件のレコードを含むテーブルに対してクエリが実行され、検索条件が 333,333 件以下のレコードに一致する。
ただし、次の場合、セレクティブなフィルタにはならない。
1.検索条件の演算子が、!=、NOT CONTAINS、NOT STARTS WITHなどの否定演算子。
2.検索条件に CONTAINS 演算子が使用され、スキャンされる行数が 333,000 を超える。
3.空の値またはNULLと比較している(NULLを含まないインデックスの場合)。
4.INで比較されるコレクションに空の値が含まれるとセレクティブにならない。
5.中間一致、後方一致
セレクティブなクエリ
次の条件を満たすとき、セレクティブなクエリ隣、実行速度が高速かされる
1.シンプルフィルタ:いずれかのフィルタがセレクティブであること
※ANDで接続された条件句のこと
2.複合フィルタ:すべてのフィルタがセレクティブであること
※ORで接続された条件句のこと
インデックス
標準インデックス
・ID
・Name
・RecordTypeId
・Division
・Email(取引先責任者とリード)
・CreatedDate
・SystemModStamp
・LastModifiedDate (LastModifiedDate < DateField となるときはインデックスは使用されない)
カスタムインデックス
・参照関係項目
・主従関係項目
・外部IDが設定された項目
・ユニークが設定された項目
・カスタムインデックスが付与された項目
:::note
infoSalesforceに依頼が必要
:::
測定方法
クエリプランツールを使用する。
使用方法
- 開発者コンソールで、Help > Preferences で表示される設定画面の Enable Query Plan をtrue に変更。
- Query Editor にクエリを記入。
- Query Plan ボタンをクリック。