1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Apex】【エラー】Non-selective query against large object type

1
Posted at

その日事件は突然起こった

運用中の本番環境、ケースレコードを作成したときに発生したエラー。

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?