Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

非選択的クエリが Apex トリガーで失敗するがスタンドアロンクエリとして成功する

公開日: Jun 12, 2025
説明
※この記事は英語版を翻訳しており、一部機械翻訳を含むため内容は後日更新される可能性があります。最新の内容は英語版を参照してください。表示言語は画面右下の言語名から切り替えられます。

Apex トリガーコンテキストを介して SOQL クエリを実行しようとすると、Apex コードで「System.QueryException: Non-selective query against large object type (System.QueryException: 大きなオブジェクト種別に対する非選択的クエリ)」エラーが発生することがあります。

System.QueryException: Non-selective query against large object type (more than 200000 rows). Consider an indexed filter or contact salesforce.com about custom indexing. (System.QueryException: (200,000 行を超える) 大きなオブジェクト種別に対する非選択的クエリ。インデックス付き検索条件を考慮するか、カスタムインデックスについて salesforce.com に問い合わせてください。)

項目にインデックスを付けても、次の場合にまだ検索条件で選択できないことがあります 
1.検索条件値に null が含まれている (null を含むリストとのバインドなど)
2.一致する行数がきわめて大きいため、データスキューが存在する (何回も出現する特定の外部キー値の絞り込みなど)

ただし、Developer Console (つまり匿名 Apex) を介して実行すると、同じクエリが正常に実行します。このケースでエラーが発生しないのはなぜですか?
解決策


設計で、トリガーコンテキストでの大きなオブジェクト種別に対する非選択的クエリは許可されません (Apex トリガーの評価時)。この設計の制限により、非決定的クエリの実行時間 (SOQL クエリの実行に必要な完全/部分テーブルスキャンのため) がエンドユーザーのエクスペリエンスに及ぼす可能性のある影響を回避します。結果として、トリガーコンテキスト内の大きなオブジェクト種別への非選択的クエリの実行の試みが妨げられ、前述のエラーメッセージが表示されます。

注: この制限を設定せず、影響を受けるクエリが、レコードの保存時に呼び出される指定したトリガー内で実行された場合、最悪のケースシナリオでは、エンドユーザーはクエリがタイムアウトし、何らかの UI フィードバックを取得するまで待つ必要があります。

クエリが Developer Console 内または SOAP/REST API を介して実行された場合は、同じ制限が適用されません。このケースでは、標準のクエリタイムアウトが適用されます。つまり、クエリが試みられ、特定の時間より長くかかった場合にのみタイムアウトします。

影響を受ける SOQL クエリがインデックスを利用できるように、クエリを最適化することをお勧めします。SOQL クエリを最適化する方法の詳細については、Salesforce クエリ検索最適化開発者向けチートシートを参照してください。

ナレッジ記事番号

000386468

 
読み込み中
Salesforce Help | Article