その日事件は突然起こった
運用中の本番環境、ケースレコードを作成したときに発生したエラー。
System.QueryException: Non-selective query against large object type (more than 200000 rows).
これまでは普通に登録できており、エラー内容も初めて見るものでした。
ログを見ていると、ケーストリガ内で実行されたのSOQLが悪さをしているようです。
問題のSOQLはこんな感じ↓
SELECT Id, Name, Phone FROM Account WHERE Phone IN :phoneNumbers
ケースレコードに登録されている電話番号をphoneNumbers(Set)に格納して、phoneNumbersで取引先レコードを検索しています。
何の変哲もない、どこにでもあるSOQLです。
直近のリリースなどはなく、サンドボックスでも再現ができません。なんだこれ~~。
犯人はお前だ
エラー文で検索すると、Salesforce公式さんのヘルプページを発見
https://help.salesforce.com/s/articleView?id=000323572&type=1
ふむふむ、なんと20万件を超えると出ちゃうエラーのようです。
たしかに、本番環境には20万件強の取引先レコードができていました。サンドボックスで再現しないわけだ。
読んでいるとどうやらSQLを選択的にする必要があるらしいのですが、、、
すでに運用していて問題なく使えていた。
下手に改修するとリスクがあるし工数もかかる。
といことで、カスタムインデックス付与を依頼することにしました。
サポートに問い合わせ
Salesforce公式さん、ご丁寧にこんなヘルプもありました。
https://help.salesforce.com/s/articleView?id=000335072&type=1
a. ●●●(組織ID)
b. SELECT Id, Name, Phone FROM Account WHERE Phone IN ( '03-1234-5678','03-2345-6789','03-3456-7890')
c. ●●●(実行ユーザ名)
d. はい
e. Account
f. Phone
必要な情報を書きました。今回の場合はPhoneで検索かけるのでこれにカスタムインデックスを付与してもらいます。
そして平和がおとずれた
カスタムインデックス付与をしてもらうと、これまでどおりにケースレコード作成ができるようになりました。
急に身に覚えのないエラーが発生してビビった話でした。
参考
https://help.salesforce.com/s/articleView?id=000323572&type=1
https://help.salesforce.com/s/articleView?id=000335072&type=1