Loading

Baja de Big Objects de Async SOQL en Salesforce

Fecha de publicación: Mar 27, 2023
Descripción

Salesforce dará de baja y ya no será compatible con la función Async SOQL de Big Objects con la versión Summer '23. 

Async SOQL se retira como parte de la mejora continua de Salesforce Platform, ya que hemos dejado de utilizar tecnologías compatibles con Async SOQL. Se sustituye por API más familiares para los clientes.

¿Qué significa este cambio para mí? 

Deberá utilizar la API masiva o Apex por lotes para realizar consultas o informes sobre Big Objects personalizados después de que su organización se actualice a la versión Summer '23. Después de la versión, los trabajos que ejecuten Async SOQL no estarán disponibles. Le recomendamos que pruebe la sustitución de Async SOQL en las organizaciones Sandbox antes de la versión Summer '23. Revise el sitio de confianza de Salesforce para planificar cuándo se actualiza su organización.

¿Puede CRM Analytics continuar con la carga de datos de BigObjects?

Sí, CRM Analytics utiliza solicitudes API masivas para cargar los datos.

¿Qué debo utilizar para consultar más de 50 000 registros?

Tanto la API masiva como Apex por lotes pueden consultar resultados de más de 50 000 registros. Sin embargo, Salesforce sugiere utilizar Apex por lotes mediante la activación de trabajos Apex por lotes adicionales.

¿Qué debo hacer si tengo millones de registros y mis consultas masivas o Apex se demoran?

Si tiene muchos registros y desea realizar consultas de forma más eficaz, puede actualizar su índice para incluir los campos que necesita consultar o cambiar la forma en que almacena sus datos en Big Objects. Si divide los datos en Big Objects separados, puede utilizar Async SOQL para migrar los datos a estos nuevos objetos. Si tiene previsto migrar datos mediante Async SOQL, asegúrese de hacerlo antes de que se retire en la versión Summer '23.

¿Qué ocurre si decido migrar fuera de Big Objects?

Si migra a una solución diferente, puede utilizar Database.deleteImmediate para eliminar sus datos. Salesforce no eliminará sus datos. Debe eliminar los datos usted mismo.

¿Cuáles son las alternativas a Async SOQL y cómo utilizarlas?

Puede consultar Big Objects mediante la API masiva y Apex por lotes. Consulte los siguientes ejemplos de alternativas para las consultas SOQL Async existentes.

Seguimiento de auditoría de campo

Este ejemplo muestra cómo consultar FieldHistoryArchive y analizar los resultados en un archivo CSV.

Ejemplo URI

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


Ejemplo de solicitud de entrada

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

Utilice el recurso Obtener resultados de un trabajo de consulta.

Ejemplo de solicitud 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

Esta solicitud da como resultado un archivo CSV para examinar con fines de auditoría.

Ver Customer 360


Apex por lotes es una alternativa a Async SOQL para el procesamiento automatizado en un Big Object o ApiEvent, ReportEvent o ListViewEvent. Este ejemplo muestra cómo agregar un proceso que haga referencia a datos correlacionados.

Ejecute una consulta Apex por lotes en un Big Object y correlacione la información de Contacto asociada a ese Big Object.

Nota: No se puede consultar un número ilimitado de Big Objects en Apex. Apex tiene un límite de 6 MB para la sincronización y de 12 MB para la asincronización. Por ejemplo, si tiene 6000 entradas de 1KB cada una, solo puede almacenar 6000 registros en memoria.

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){         // process the batch of Big Objects and associate them to Accounts         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);             // perform any actions that integrate the Big Object and Account         }     }     public void finish(Database.BatchableContext bc){         // Daisy chain additional calls using the primary key of the Big Object to get around the 50k governor limit         QueryBigObjectAndContact nextBatch = new QueryBigObjectAndContact(key);         Database.executeBatch(nextBatch);     } }


Monitoreo de eventos en tiempo real

Este ejemplo muestra cómo consultar y analizar un Big Object de eventos mediante el contenido de un campo.

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){         // Process this list of entities if a certain attribute matches         for (ApiEvent event: events) {             String objectString = 'Patent__c';             String eventIdentifier = event.EventIdentifier;             if (eventIdentifier.contains(objectString) {                 // Perform actions on the event that contains 'Patent__c'             }             lastEventDate = format(event.EventDate);         }     }     public void finish(Database.BatchableContext bc){                  // Daisy chain additional calls using EventDate or other filter fields to get around the 50k governor limit         EventMatchesObject nextBatch = new EventMatchesObject(lastEventDate);         Database.executeBatch(nextBatch);     } }


Consultas agregadas

Este ejemplo muestra una alternativa para consultas agregadas similar al método 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){         // process the batch of Big Objects and associate them to Accounts         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);             // perform any actions that integrate the Big Object and Account         }     }     public void finish(Database.BatchableContext bc) {                  // Daisy chain additional calls using the primary key of the Big Object to get around the 50k governor limit         CountBigObjects nextBatch = new CountBigObjects(recordsCounted, key);         Database.executeBatch(nextBatch);     } }


Si tiene más preguntas, abra un caso en el Servicio de atención al cliente a través de la Ayuda de Salesforce. Para leer sobre el enfoque de Salesforce sobre la retirada de productos y funciones, lea nuestra Filosofía de la retirada de productos y funciones.

Número del artículo de conocimiento

000394892

 
Cargando
Salesforce Help | Article