SalesforceにおけるQueryとは?
SalesforceにおけるQueryは、指定のオブジェクトに対して、クエリを実行し、指定の条件に一致するデータを返すものです。
「query() コール」を使うことで、オブジェクトからデータを取得することができます。
クライアントアプリケーションが「query() コール」を呼び出す際に、照会するオブジェクトを指定する「クエリ式」、「取得する項目」、「特定のオブジェクトが該当するかどうかを判断する条件」を渡すようになっています。
例)
QueryResult = connection.query(string queryString);
使用方法について
Queryは呼び出し時、クエリレスポンスオブジェクトをクライアントアプリケーションに返します。
「query() コール」で呼び出すと、APIは特定のオブジェクトに対してクエリを実行、API上のクエリ結果をキャッシュします。そして、クエリレスポンスオブジェクトをクライアントアプリケーションに返すのです。
クライアントアプリケーションはクエリレスポンスの行を通して繰り返し実行し、情報を取得することを目的とし、クエリレスポンスオブジェクト上のメソッドを使うことができます。
「Enterprise WSDL」を使っているときは、選択リストへのデータ入力について、「describe」を使ってはいけません。
実行後にシステム管理者が、SObjectに項目を追加する場合、「describe コール」は項目をプルダウンしますが、ツールキットではシリアライズを処理できませんので、インテグレーションは失敗します。
Queryとアーカイブ
アーカイブされているかどうかに関係なく、全てのToDoと行動のレコード上において、「queryAll()」でクエリを実行することができます。
アーカイブ済みのオブジェクトだけを検索する方法は、「isArchived 項目」を絞り込みに利用することです。query() は「isArchived」が「true」に設定されているとき、全レコードを自動的に除外します。そのため、query()が使えません。
クエリ結果のオブジェクトについては、デフォルトで500行までのデータが含まれます。
クエリ結果が500行を超えた場合、クライアントアプリケーションは「queryMore() コール」とサーバ側のカーソルを使うことで、追加の行を500行のチャンクで取得することができ、「QueryOptions ヘッダー」のデフォルトサイズを2,000行まで増やせます。
タイムアウト
処理が2分以上経過したQueryはタイムアウトします。
タイムアウトしたQueryについては、APIは「InvalidQueryLocatorFault」の「API 失敗エラー要素」を返してきます。タイムアウトが発生した場合、より少量のデータをスキャン、もしくはクエリを再構成します。
型が「Base64」の項目について照会する際、クエリレスポンスオブジェクトは、一度で1つのレコードだけしか返しません。「query() コール」のバッチサイズを変更したとしても変更することはできません。
動的SOQLでのQueryの使用
Salesforceにおける動的SOQLでのQueryの使用方法について説明します。
動的SOQLは、「Apex コード」を使って、実行時にSOQL文字列の作成を参照しています。動的SOQLがあることで、柔軟なアプリケーションの作成ができるのです。たとえば、エンドユーザの入力に基づいた検索の作成や、さまざまな項目名のレコードの更新といったことができます。
動的SOQL結果は、「Account」や「MyCustomObject__c」、「汎用 sObject データ型」などのように、具体的な「sObject」として指定することができます。クエリが正しい「sObject データ型」を返さなかった場合は、ランタイムエラーが発生します。
例)
sObject s = Database.query(string_limit_1);
List sobjList = Database.query(string);
Queryの実行と結果の取得について
SalesforceでのQueryを使ったメソッド実装について説明します。
このメソッドは、ユーザのデバイスが提供した緯度と経度の値を取ることにより、最寄の倉庫を検索します。
関連性の高いレコードを検索するために、指定したパラメータを完全なSOQLクエリに変換しなければなりません。SOQLは「Force.com プラットフォーム」のクエリの第一言語です。SOQLはApexで使えますが、他のSalesforce APIとも併用可です。
文字列の連結で必要な SOQL要素をパラメータ値と組み合わせることにより、クエリを動的に構築します。続いてクエリを実行することで結果を取得します。
SOQLクエリを選択的にする方法
大きなオブジェクトをクエリするときは、特別な設計上の考慮をしなければなりません。
非選択的クエリは違うプログラミング要素を失敗させる可能性があります。SOQLクエリの複雑さは、項目がインデックスを作る際に適しているかどうかへの影響が大きいです。
「Salesforce SOQL クエリオプティマイザ」が高レベルでの動作の仕方について説明されてきました。
しかし、その動作は追加のパフォーマンス強化に対応しなければなりませんので、予告なしで変更される場合があります。開発者は、開発者コンソール内で「クエリプランビュー」を使うことを推奨しています。
SOQLのパフォーマンスは、選択的フィルタに依存しています。SOQLクエリが一つの選択的フィルタを含んでいるとき、そのクエリは選択的です。SOQLクエリが選択的フィルタを含んでいないときは、そのクエリは非選択的であり、フルテーブルスキャンが必要です。
シンプルフィルタ
シンプルフィルタが選択的であることを確認する方法について説明します。
フィルタが標準項目にあるときに、それが「プライマリキー」や「外部キー」、「監査項目」である場合はインデックスを持ちます。カスタム項目は一意、もしくは外部IDとしてマークされた場合にインデックスを持ちます。
フィルタがインデックスを持たない場合は最適化のための考慮はありません。フィルタがインデックスを持っている場合は、レコードが返されるのが何件になるかを決定します。
標準インデックスでは、しきい値は初めの100万ターゲットレコードの30パーセントになり、初めの100万レコードの後は全レコードの15パーセントになります。
また、標準インデックスの選択的しきい値は、560万以上の合計レコードを持っていた場合にのみ達する可能性がある100万ターゲットレコードが最大です。
SalesforceでQueryを活用しよう!
今回はSalesforceの標準機能の1つである「Query」について紹介しました。
クエリ結果が大きすぎると、応答には結果の最初のバッチと応答の「nextRecordsUrl 項目」のクエリ識別子が入っています。識別子は追加の要求で次のバッチを取得するときに使えます。
また、「q パラメータ」を使うクエリにおいては、クエリ結果レコードの配列が応答に入っています。「explain パラメータ」を使うクエリでは、クエリやレポート、リストビューの実行に使用できる、 1つ以上のクエリ実行プランが応答に入っています。
Queryの使い方、注意点を知ることで、Queryのことがより深く理解でき、使用する際に大いに役に立ちます。SalesforceでのQueryの使用方法をイメージし、転職活動に役立てていきましょう。]]>