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

Salesforce の Big Object の非同期 SOQL の廃止

公開日: Mar 27, 2023
説明

'23 Summer リリースをもって、Salesforce は Big Object の 非同期 SOQL 機能を廃止し、サポートを終了します。

Salesforce は非同期 SOQL をサポートするテクノロジーから移行し、進化しているため、Salesforce Platform の継続的な改善の一環として非同期 SOQL を廃止することとなりました。非同期 SOQL は、お客様にとってよりなじみのある API に置き換えられます。

この変更は私にとって何を意味しますか? 

組織が Summer '23 リリースにアップグレードされた後に、カスタム Big Object でクエリを行うまたはレポートを作成するには、Bulk API または Apex の一括処理を使用する必要があります。リリース後は、非同期 SOQL を実行するジョブは利用できなくなります。Summer '23 リリース前に、Sandbox 組織で非同期 SOQL の置き換えをテストすることをおすすめします。Salesforce の Trust サイトを確認し、組織をアップグレードするときに備えて計画を立ててください。

CRM Analytics は引き続き Big Object からデータをロードできますか?

はい、できます。CRM Analytics は Bulk API 要求 を使用してデータをロードします。

50,000 を超えるレコードをクエリするには何を使用すればよいですか?

Bulk API と Apex の一括処理はどちらも、50,000 を超える結果をクエリできます。ただし、Salesforce では、追加の Apex の一括処理ジョブをトリガーして Apex の一括処理を使用することを推奨しています。

数百万のレコードがあり、Bulk クエリまたは Apex クエリがタイムアウトになった場合はどうすればよいですか?

レコード数が多く、より効率的にクエリを実行したい場合は、インデックスを更新してクエリに必要な項目を含めるか、Big Object にデータを格納する方法を変更することができます。データを個別の Big Object に分割する場合は、非同期 SOQL を使用してデータをこれらの新しいオブジェクトに移行できます。非同期 SOQL を使用したデータ移行を予定している場合は、Summer '23 リリースで廃止される前に移行を行ってください。

Big Object から移行すると決めた場合はどうすればよいですか?

別のソリューションに移行する場合は、Database.deleteImmediate を使用してデータを削除できます。Salesforce ではデータを削除しません。お客様ご自身で、データを削除する必要があります。

非同期 SOQL の代替手段とその使用方法を教えてください。

Bulk API と Apex の一括処理を使用して Big Object にクエリを実行できます。既存の非同期 SOQL クエリの代替方法については、次の例を参照してください。

項目監査履歴

この例では、FieldHistoryArchive にクエリを実行し、結果を CSV ファイルで分析する方法を示します。

URI の例

/services/data/vXX.X/jobs/query


Post 要求の例

{ "operation": "query", "query": "SELECT ParentId, FieldHistoryType, Field, Id, NewValue, OldValueFROM FieldHistoryArchive WHERE FieldHistoryType = ‘Account’ AND CreatedDate > LAST_MONTH" }

クエリジョブの結果の取得のリソースを使用してください。

CURL 要求の例

curl --include --request GET \ --header "Authorization: Bearer token" \ --header "Accept: text/csv" \ https://instance.salesforce.com/services/data/vXX.X/jobs/query/750R0000000zxr8IAA/results ?maxRecords=50000

この要求により、監査目的で検査する CSV ファイルが生成されます。

Customer 360 ビュー


Apex の一括処理は、Big Objec または ApiEvent、ReportEvent、ListViewEvent の自動処理のための非同期 SOQL に替わる手段です。次の例は、相関データを参照する処理を追加する方法を示しています。

Big Object に一括処理 Apex クエリを実行し、その Big Object に関連付けられた取引先責任者情報を相互に関連付けます。

メモ: Apex では、Big Object を無制限にクエリすることはできません。同期の場合は 6 MB、非同期の場合は 12 MB の Apex のヒープサイズ制限が適用されます。たとえば、それぞれが 1KB のエントリが 6,000 個ある場合、メモリに保存できるのは 6,000 レコードのみです。

public class QueryBigObjectAndContact implements Database.Batchable<sObject> {     private String key;     public QueryBigObjectAndContact(String keyParam) {         key = keyParam     }          public Iterable<SObject> start(Database.BatchableContext BC) {         return [SELECT Big_Object_Field__c, Account__c FROM Big_Object__b WHERE Big_Object_Primary_Key__c > key LIMIT 50000]     }     public void execute(Database.BatchableContext bc, List<Big_Object__b> bos){         // Big Object のバッチを処理し、アカウントに関連付ける         Map<Id, Big_Object__b> accountIdToBigObjectMap = new Map<Id, Big_Object__b>();         for (Big_Object__b bigObject : bos) {             accountIdToBigObjectMap.put(bigObject.Account__c, bigObject);             key = bigObject.Big_Object_Primary_Key__c         }         Map<Id, Account> = new Map<Id, Account>(             [SELECT Id, Name, ...FROM Account WHERE Id IN :accountIdToBigObjectMap.keySet()]         );         for (Id accountId : accountMap.keySet()) {             Big_Object__b bigObject = accountIdToBigObjectMap.get(accountId);             Account account = accountMap.get(accountId);             // Big Object とアカウントを統合するアクションを実行する         }     }     public void finish(Database.BatchableContext bc){         // Big Object の主キーを使用して追加の呼び出しを連鎖させ、50k ガバナ制限を回避する         QueryBigObjectAndContact nextBatch = new QueryBigObjectAndContact(key);         Database.executeBatch(nextBatch);     } }


リアルタイムイベントモニタリング

この例では、項目の内容を使用して、イベントに関する Big Object をクエリし、分析する方法を示します。

public class EventMatchesObject implements Database.Batchable<sObject> {     private String lastEventDate;     public EventMatchesObject(String lastEventDateParam) {         lastEventDate = lastEventDateParam;     }     public Iterable<SObject> start(Database.BatchableContext bc) {         return [SELECT EventDate, EventIdentifier, QueriedEntities, SourceIp, Username, UserAgent FROM ApiEvent WHERE EventDate > lastEventDate LIMIT 50000]     }     public void execute(Database.BatchableContext bc, List<ApiEvent> events){         // 特定の属性が一致する場合、このエンティティのリストを処理する         for (ApiEvent event: events) {             String objectString = 'Patent__c';             String eventIdentifier = event.EventIdentifier;             if (eventIdentifier.contains(objectString) {                 // 'Patent__c' を含むイベントに対してアクションを実行する             }             lastEventDate = format(event.EventDate);         }     }     public void finish(Database.BatchableContext bc){                  // EventDate またはその他のフィルター項目を使用して追加の呼び出しを連鎖させ、50k ガバナ制限を回避する         EventMatchesObject nextBatch = new EventMatchesObject(lastEventDate);         Database.executeBatch(nextBatch);     } }


集計クエリ

この例では、COUNT() メソッドに似た集計クエリの代替案を示します。

public class CountBigObjects implements Database.Batchable<sObject> {     private Integer recordsCounted;     private String key;     public CountBigObjects(Integer recordsCountedParam, String keyParam) {         recordsCounted = recordsCountedParam         key = keyParam     }      public Iterable<SObject> start(Database.BatchableContext bc) {         return [SELECT Custom_Field__c FROM Big_Object__b LIMIT 25000]     }     public void execute(Database.BatchableContext bc, List<Big_Object__b> bos){         // Big Object をバッチ処理し、アカウントに関連付ける         Map<Id, Big_Object__b> accountIdToBigObjectMap = new Map<Id, Big_Object__b>();         for (Big_Object__b bigObject : bos) {             accountIdToBigObjectMap.put(bigObject.Account__c, bigObject);         }         Map<Id, Account> accountMap = new Map<Id, Account>(             [SELECT Id, Name, ...FROM Account WHERE Id IN :accountIdToBigObjectMap.keySet()]         );         for (Id accountId : accountMap.keySet()) {             Big_Object__b bigObject = accountIdToBigObjectMap.get(accountId);             Account account = accountMap.get(accountId);             // Big Object とアカウントを統合するアクションを実行する         }     }     public void finish(Database.BatchableContext bc) {                  // BigObject の主キーを使用した追加呼び出しを連鎖させ、50k ガバナ制限を回避する         CountBigObjects nextBatch = new CountBigObjects(recordsCounted, key);         Database.executeBatch(nextBatch);     } }


ご質問がある場合は、Salesforce ヘルプからサポートにお問い合わせください。製品や機能を廃止する Salesforce のアプローチについては、「製品 & 機能廃止の方針」をご覧ください。

ナレッジ記事番号

000394892

 
読み込み中
Salesforce Help | Article