function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
英樹 隅野英樹 隅野 

System.QueryException: Non-selective query against large object type の対応・対処

はじめまして。
salesforceにてトリガの作成→リリースまでできたのですが、トリガが実行されるとエラーが発生してしまいます。私自身、salesforceでの開発経験が少なく、具体的にどのように対処すればいいのかわからないため、ご存知の方がいらっしゃいましたらご教示いただきたく思っております。

活動(行動)オブジェクトに対するトリガで、行動オブジェクトには20万件以上のデータがあります。

インデックス項目をwhere句に入れる必要があることまではわかり、where句に”whatId”の条件をいれましたが、結果はかわらずエラーとなってしまいました。
 
FROM      Event
WHERE     C_Item_F_AnkenID__c <> '' and WhatId IN :ankenIds

上記のはそのwhere句になります。
”whatId”にカスタムオブジェクトのID(案件ID)が設定されている行動レコードを取得する、というものなので、数件、おおくても20件ほどのヒットと思われるのですが、エラーが発生します。

10万件以上ある行動オブジェクトに対し、条件等色々とあるかとは思いますが、どのような対処をおこなえばエラーが発生せずにデータ取得をすることができるようになるのか、ご教示いただきたく存じます。

宜しくお願いします。
Taiki YoshikawaTaiki Yoshikawa

このエラーに関するヘルプがありました。
https://help.salesforce.com/articleView?id=000176875&language=ja&type=1
 

このエラーは Apex トリガ内から発行される SOQL が以下の状態の時に発生します。
対象オブジェクト上のレコード件数が 200,000 レコード以上
SOQL の WHERE 句に使用されている項目に 外部ID / カスタムインデックスが付与されていない
外部ID / カスタムインデックスが付与されていたとしても、インデックスが有効に動作する条件に合致していない
※インデックスが有効に動作する条件は Apex 開発者ガイドの「より効率的な SOQL クエリ」項を参照

やはりレコード件数が大きすぎるのと絞り込み条件が不足していることが原因のようです。
※SOQL の WHERE 句に使用されている項目に 外部ID / カスタムインデックスが付与されていないが当てはまると思います。

規模の大きな組織だと思うのですが、営業担当の方やプレミアサポートへの相談は可能でしょうか。インデックスの付与などの対応を行う必要があるみたいです。
英樹 隅野英樹 隅野
コメントいただき、ありがとうございます。

salesforceのサポートへ問い合わせてみました。
where句の条件にインデックス項目を入れるだけではインデックスが効かず、インデックスが有効となる条件にまで絞り込みを行う(条件を追加する必要がある)とのことでした。
https://help.salesforce.com/articleView?id=000006007&language=ja&type=1

条件を変えて実行したところ、エラーが発生せずにデータを抽出することができました。
(トリガがエラーとならず、意図した更新を行うことができました)

インデックス項目を条件に入れること、またインデックスが有効になるには条件があることを
意識してトリガの作成を行っていこうと思います。

ありがとうございました。