Loading

Retirada de Async SOQL para Salesforce Big Objects

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

Salesforce tiene prevista la retirada y el fin de la compatibilidad con la función Async SOQL de Big Objects a partir del lanzamiento de la versión Summer ’23. 

La retirada de esta función forma parte de la mejora continua de Salesforce Platform, dado que, poco a poco, nos estamos alejando de tecnologías que son compatibles con Async SOQL. Esta función se reemplazará por API a las que los clientes están más habituados.

¿Qué implica este cambio para mí? 

Después de que su organización actualice a la versión Summer ’23, deberá usar la API masiva o Apex por lotes para enviar una consulta o elaborar un informe de Big Objects personalizado. Después del lanzamiento de esta versión, los trabajos que ejecuten Async SOQL dejarán de estar disponibles. Nuestra recomendación es que pruebe la opción alternativa a Async SOQL en las organizaciones sandbox antes de que se lance la versión Summer ’23. Revise el sitio de Salesforce Trust para planificar la actualización de la organización.

¿Se pueden cargar datos de CRM Analytics desde objetos grandes?

Sí, CRM Analytics utiliza solicitudes de la API masiva para cargar los datos.

¿Qué debo utilizar para las consultas si tengo más de 50 000 registros?

Tanto la API masiva como Apex por lotes pueden consultar más de 50 000 resultados. Sin embargo, la recomendación de Salesforce es que se use Apex por lotes mediante la activación de trabajos adicionales.

¿Qué debo hacer si tengo millones de registros y las consultas de la API masiva o Apex agotan el tiempo de espera?

Si tiene demasiados registros y quiere realizar consultas de una forma más eficaz, puede actualizar el índice para incluir los campos que necesita consultar o cambiar el modo en que almacena sus datos en Big Objects. Si divide los datos en Big Objects independientes, puede usar Async SOQL para migrarlos a estos objetos nuevos. Si tiene pensado migrar datos con la función Async SOQL, asegúrese de hacerlo antes de que se retire en la versión Summer ’23.

¿Qué ocurre si quiero migrar mis datos de Big Objects a otra solución?

Si quiere migrar a otra solución, puede usar Database.deleteImmediate para eliminar los datos. Salesforce no eliminará los datos. Debe hacerlo usted mismo.

¿Qué alternativas a Async SOQL hay y cómo se usan?

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

Traza de auditoría de campo

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

URI de ejemplo

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


Solicitud POST de ejemplo

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

Utilice el recurso Obtener resultados de una tarea de consulta.

Solicitud CURL de ejemplo

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 genera un archivo CSV que se puede examinar con fines de auditoría.

Vista de Customer 360


Apex por lotes es una alternativa a Async SOQL para el procesamiento automatizado de un objeto tipo Big Object o ApiEvent, ReportEvent y ListViewEvent. En este ejemplo mostramos cómo añadir un procesamiento que haga referencia a los datos correlacionados.

Ejecute una consulta de Apex por lotes en un objeto de tipo Big Object y correlacione la información de contacto asociada con ese objeto.

Nota: No puede consultar una cantidad ilimitada de objetos Big Object en Apex. El límite de montón de Apex es de 6 MB en caso de solicitudes síncronas y 12 MB en caso de solicitudes asíncronas. Por ejemplo, si tiene 6000 entradas a 1 KB cada una, solo podrá almacenar 6000 registros en la 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);     } }


Supervisión de eventos en tiempo real

En este ejemplo mostramos cómo consultar y analizar un objeto Big Object de evento 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

En este ejemplo se 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