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

開発者コンソールのクエリプランツールに関する FAQ

公開日: Aug 30, 2024
説明

開発者コンソールの新しいクエリプランツールは、大量の SOQL クエリの実行時間を短縮できます。大量のクエリの実行を最適化して実行時間を短縮するには、クエリプランツールを使用します。 

 

クエリプランツールの有効化と使用

  1. 開発者コンソールで、[ヘルプ] | [環境設定] の順にクリックします。
  2. [Enable Query Plan] (クエリプランを有効化) を TRUE に設定します。


開発者コンソールで有効にすると、コンソールの [クエリエディター] タブでクエリプランツールにアクセスできるようになります。

クエリプランツールを使用するには、クエリエディターにクエリを入力し、[クエリプラン] を押すと、すべてのクエリ操作と、指定した SOQL の各操作のコストが表示されます。

 
解決策

クエリプランツールを使用する理由

このツールは、処理速度が遅い SOQL クエリのクエリプランをチェックするのに使用します。異なるプランへのインサイトを提供し、条件がインデックス化されている場合は、テーブルの完全スキャンを実行した場合のコストと比較してそのインデックスを使用した場合のコストを示します。

テーブルのスキャンの方がインデックスよりも低く、かつクエリがタイムアウトする場合は、別の条件を使用してさらに解析を行って選択度を向上させるか、そのクエリにインデックス化されていない別のセレクティブ条件がある場合はそれも候補として検討します。
 

検索条件がセレクティブかどうかを確認します。

  • インデックスが付いているかどうかを確認します。
  • 標準項目に条件である場合、主キー (Id、Name、OwnerId)、外部キー (CreatedById、LastModifiedById、ルックアップ、主従関係)、および監査項目 (CreatedDate、SystemModstamp) であればインデックスが付いています。
  • カスタム項目は、一意の ID または外部 ID とマークされていればインデックスがあります。
  • 条件にインデックスがない場合、最適化の対象としてはみなされません。
  • 条件にインデックスがある場合は、返されるレコードの数を調べます。
  • 標準インデックスの場合、しきい値は最初の 100 万件の対象レコードの 30%、100 万件以降のすべてのレコードの 15% です。また、標準インデックスのセレクティブしきい値の上限は対象レコードの合計 100 万件です。ただし、レコードの合計が 560 万件以上ないとこの上限に達することはありません。
  • カスタムインデックスの場合、セレクティブしきい値は最初の 100 万件の対象レコードの 10%、100 万件以降のすべてのレコードの 5% です。  また、カスタムインデックスのセレクティブしきい値の上限は対象レコードの合計 333,333 件です。ただし、レコードが 560 万件以上ないとこの上限に達することはありません。
  • 条件がしきい値を超えると、最適化の対象としてはみなされません。
  • 条件がしきい値を超えなかった場合、この条件は IS セレクティブで、クエリオプティマイザーによって最適化の対象とみなされます。
 

つまり:

クエリプランツールを実行すると、指定したクエリにクエリオプティマイザーで利用できるプランがコストの昇順 (低い順) で表示されます。

各プランには、Cardinality (基数)、Operation Type (操作種別)、Cost (コスト)、sObject Type (sObject 型) などの情報が含まれています。プランごとに、項目インデックスやテーブルの完全スキャンなど、「主要な操作種別」があります。最もコストが低いクエリが、クエリ実行を促進するために使用されます。

 

基数
項目
主要な操作種別
コスト
sObject 基数
sObject 型
主要な操作種別で返されると予想されるレコードの件数。
たとえば、インデックステーブルを使用した場合に返されるレコードの数。
 
クエリオプティマイザーによって使用されるインデックス付けされた項目。主要な操作種別がインデックスの場合、項目値は「Index」になります。それ以外の場合、項目値は null です。
クエリを最適化するために Salesforce で使用される主な操作種別。
  • Index - クエリでクエリ対象オブジェクトにインデックスが使用されます。
  • Sharing - クエリを実行しているユーザーに関連付けられた共有ルールに基づいたインデックスがクエリで使用されます。ユーザーがアクセスできるレコードを制限する共有ルールがある場合、Salesforce ではそのルールを使用してクエリを最適化することができます。
  • TableScan - クエリ対象オブジェクトのすべてのレコードがクエリでスキャンされます。
  • Other - Salesforce の内部的な最適化がクエリで使用されます。
Force.com クエリオプティマイザーの選択しきい値と比較したクエリのコスト。値が 1 を超える場合、そのクエリはセレクティブにはなりません。
クエリ対象オブジェクトの最大レコード件数。
クエリ対象の名前。
 

 

コストはどのように判断されますか?

プランごとに独自のコスト値があります。コスト値は、テーブルと値で収集された最新のデータベース (DB) 統計を基に計算されます。最もコストが低いプランが使用プランとして選定されます。1 を超えるコスト値は、クエリがセレクティブにならないことを示します。

 

インデックス付き項目がプランのリストに表示されない

指定したクエリで条件にインデックス付けされた項目が含まれる場合、その項目についてサポートされている操作を使用している場合にのみ、その項目のプランが表示されます。

サポートされていない操作は次のとおりです:

  • 「NOT EQUAL TO (不等号)」などの演算子を使用した比較では、カスタムインデックスは使用されません。
  • 「Name =」などの null 値を使用した比較では、カスタムインデックスは使用されません。
  • 先頭の「%」ワイルドカードは非効率な演算子で、やはり検索条件がセレクティブになりません。
  • OR 比較演算子を使用する場合、条件はインデックス付けする必要があり、かつ 10% しきい値未満にする必要があります。インデックス付けされていない項目または 10% を超える項目があると、プランは表示されません。

注意: インデックスを使用する OR フィルターは、説明プランの出力に「Other」として表示されます。

クエリプランツールには、インデックス候補またはインデックス付け可能な項目が表示されますか?

クエリプランツールでは、プランのセクションにインデックス付けされた項目の統計が表示されるだけで、インデックス付け可能な項目は表示されません。このツールは、インデックス付け可能な項目に関する情報を提供するものではありません。

インデックス付け可能な項目を判断する方法については、「SOQL クエリをセレクティブにする方法」を参照してください。

 

クエリプランの結果を解釈する方法と例 

次の例では、2 つのインデックス付き項目を使用します。Account sObject のチェックボックス (InActiveAcc__c) と選択リスト (Account_Hierarchy__c)。

注意: この新しい開発者コンソールツールの元となったクエリリソースフィードバックパラメーターパイロットに関する元の投稿で、さらに多くのサンプルクエリを見つけることができます。

 

サンプルクエリ 1

SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Parent'


シナリオ:セレクティブバインド変数を含むインデックス付き項目

「Account_Hierarchy__c」項目はインデックス付けされているため、主要な操作種別が「Index」のプランとみなされました。インデックス付けされた項目は TableScan よりコストが低いため、50,088 行の Account Object (取引先オブジェクト) で実行するこのクエリには、クエリオプティマイザーによりインデックスが使用されます。

 

サンプルクエリ 2

SELECT count() FROM Account WHERE InActiveAcc__c = true AND Account_Hierarchy__c = 'Parent'


シナリオ:インデックス付き項目が 2 つ、セレクティブが 1 つ

複数の単純な条件がセレクティブな場合はどうなるでしょうか? 複数の条件がセレクティブであると判明した場合、クエリオプティマイザーはコストが低い方の条件をクエリの実行プランとして選択します。

 

サンプルクエリ 3

SELECT count() FROM Account WHERE InActiveAcc__c = true  AND Account_Hierarchy__c != 'Parent'  **NOTE:インデックスでサポートされていない操作を使用**


シナリオ:2 個のインデックス付き項目、1 個のセレクティブ BUT にサポートされていない操作を使用します。

「!=」はサポートされない操作であるため、Account_Hierarchy__c のインデックスは使用または考慮されません。  また、InActiveAcc__c は使用されますが、コスト値が 1 を超えていることに注意してください。前述のとおり、この条件はセレクティブではないですが使用されます。

 

サンプルクエリ 4

SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Child'


シナリオ:非セレクティブバインディング変数を使用するインデックスフィールド 1 つ (sObject の行数の 10% 以上)

ここでは、インデックス付けされた項目 Account_Hierarchy__c のコストは、テーブルの完全スキャンよりはるかに高くなっています。バインド変数「Child」によりインデックスがセレクティブではないため、全テーブルの 10% を超えています。DB はこのクエリに対してフルテーブルスキャンを実行しますが、フルテーブルのサイズによってはパフォーマンスが低下する可能性があります。
 

参考および推奨資料:

ナレッジ記事番号

000386864

 
読み込み中
Salesforce Help | Article