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.
000394892

We use three kinds of cookies on our websites: required, functional, and advertising. You can choose whether functional and advertising cookies apply. Click on the different cookie categories to find out more about each category and to change the default settings.
Privacy Statement
Required cookies are necessary for basic website functionality. Some examples include: session cookies needed to transmit the website, authentication cookies, and security cookies.
Functional cookies enhance functions, performance, and services on the website. Some examples include: cookies used to analyze site traffic, cookies used for market research, and cookies used to display advertising that is not directed to a particular individual.
Advertising cookies track activity across websites in order to understand a viewer’s interests, and direct them specific marketing. Some examples include: cookies used for remarketing, or interest-based advertising.