Governor Limits no Salesforce: o guia que eu queria ter recebido no primeiro dia
Entenda SOQL, DML, CPU Time e Heap Size com analogias simples, exemplos em Apex e práticas que evitam os erros mais comuns.
Beleza, se você está chegando agora no mundo Salesforce, em algum momento vai ouvir a frase “estourou o limite” e vai ficar tipo “???”. Pode ser hoje, pode ser semana que vem, mas vai acontecer.
Então bora entender isso antes que aconteça com você.
Primeiro: por que os limites existem?
O Salesforce é uma plataforma multi-tenant. Isso significa que sua infraestrutura é compartilhada. Você, eu e milhares de empresas executamos código sobre recursos compartilhados da plataforma.
Imagine um prédio comercial com vários escritórios. Todo mundo divide o mesmo elevador, a mesma rede elétrica e a mesma internet.
Se uma empresa resolve ligar 500 aparelhos de ar-condicionado ao mesmo tempo, o que acontece? Ela pode prejudicar os recursos usados pelo prédio inteiro.
Para evitar isso, o Salesforce criou os Governor Limits: limites de execução que controlam quanto cada transação pode consumir. Eles ajudam a impedir que uma execução monopolize os recursos compartilhados.
1. SOQL Limit: quantas perguntas você pode fazer ao banco
O limite: 100 consultas SOQL por transação Apex síncrona.
Toda vez que seu código executa um SELECT no banco, isso conta como uma consulta. Quando a transação ultrapassa o limite, a execução termina com uma exceção de limite.
A analogia
Imagine que você está em uma biblioteca. O bibliotecário é prestativo, mas existe uma regra: você pode fazer no máximo 100 pedidos por visita.
Se você for esperto, em vez de ir 50 vezes ao balcão pedir um livro por vez, vai uma vez e fala: “traga todos os livros de ficção científica desta lista”. Uma pergunta, vários livros.
No código, o erro clássico é este:
// EVITE: uma query para cada Account.
for (Account acc : accounts) {
List<Contact> contacts = [
SELECT Id, Name
FROM Contact
WHERE AccountId = :acc.Id
];
}
// MELHOR: reúna os IDs e consulte todos de uma vez.
List<Contact> contacts = [
SELECT Id, Name, AccountId
FROM Contact
WHERE AccountId IN :accountIds
];
2. DML Limit: quantas vezes você pode escrever no banco
O limite: 150 instruções DML por transação Apex síncrona.
DML acontece quando o código executa operações como insert, update, delete ou upsert. Cada instrução conta para o limite, independentemente de ela receber um registro ou uma lista.
A analogia
Voltando à biblioteca, agora você está devolvendo livros. Cada vez que vai ao balcão entregar um livro separadamente, faz uma operação.
Se você tem 200 livros e leva um por vez, ultrapassa o limite no 151º. Mas se coloca os livros em um carrinho e entrega a coleção de uma só vez, para esta analogia, faz uma operação.
// EVITE: um insert por registro.
for (Contact con : newContacts) {
insert con;
}
// MELHOR: um insert para a coleção.
insert newContacts;
Percebeu o padrão? No Salesforce, loop combinado com acesso ao banco exige muita atenção.
3. CPU Time Limit: quanto tempo seu código pode pensar
O limite: 10.000 milissegundos, ou 10 segundos, por transação Apex síncrona.
Esse é o tempo de CPU usado pela execução Apex e por processos chamados por ela que entram nessa medição. Loops pesados, cálculos complexos e manipulações excessivas podem consumir esse orçamento.
A analogia
Imagine que o Salesforce deu a você uma mesa em uma prova. Você tem 10 segundos de CPU para resolver todas as questões. Se o tempo acaba, a execução é interrompida, mesmo que faltasse pouco.
Um problema comum são loops aninhados que comparam tudo contra tudo:
// CUSTOSO: cada Account percorre todos os Contacts.
for (Account acc : accounts) {
for (Contact con : allContacts) {
if (con.AccountId == acc.Id) {
// Faz algo
}
}
}
// MELHOR: organize os Contacts por AccountId.
Map<Id, List<Contact>> contactsByAccount =
new Map<Id, List<Contact>>();
for (Contact con : allContacts) {
if (!contactsByAccount.containsKey(con.AccountId)) {
contactsByAccount.put(con.AccountId, new List<Contact>());
}
contactsByAccount.get(con.AccountId).add(con);
}
for (Account acc : accounts) {
List<Contact> relatedContacts = contactsByAccount.get(acc.Id);
// Busca direta no Map, sem varrer a lista inteira novamente.
}
Com 1.000 Accounts e 5.000 Contacts, a primeira abordagem pode chegar a 5 milhões de comparações. A segunda percorre as duas coleções uma vez e usa o Map para localizar os relacionados.
4. Heap Size Limit: quanta memória seu código pode ocupar
O limite: 6 MB por transação Apex síncrona.
Heap é a memória usada para guardar variáveis, listas, objetos, strings e outros dados que permanecem vivos durante a execução.
A analogia
Imagine que o Salesforce deu a você uma mesa de tamanho fixo. Tudo que precisa usar fica sobre ela: papéis, calculadora, canetas e cadernos. Se tentar manter coisa demais ao mesmo tempo, o espaço acaba.
Isso pode acontecer quando o código carrega ou constrói dados demais na memória:
// PERIGOSO: consulta ampla, sem filtro e com campos desnecessários.
List<Contact> allContacts = [
SELECT Id, Name, Description
FROM Contact
];
// MELHOR: filtre e selecione somente os campos necessários.
List<Contact> contacts = [
SELECT Id, Name
FROM Contact
WHERE CreatedDate = THIS_MONTH
LIMIT 500
];
Antes mesmo do heap, uma consulta ampla pode encontrar outros limites, como o total de linhas retornadas por SOQL. A solução não é simplesmente adicionar um LIMIT arbitrário: os filtros e a estratégia de processamento precisam respeitar a regra de negócio.
Se for realmente necessário processar um volume grande, o Batch Apex pode dividir o trabalho em lotes. Cada chamada de execute é uma transação separada e recebe um novo conjunto de limites. O tamanho do lote pode ser configurado, e 200 registros é o tamanho padrão quando ele não é informado.
Resumão visual
| Limite | O que controla | Valor síncrono | Analogia |
|---|---|---|---|
| SOQL | Consultas ao banco | 100 | Pedidos ao bibliotecário |
| DML | Instruções de escrita | 150 | Entregas no balcão |
| CPU Time | Tempo de CPU | 10 segundos | Tempo de prova |
| Heap Size | Memória usada | 6 MB | Tamanho da mesa |
O padrão que salva sua vida
Se você reparou, os quatro limites se resumem a um princípio:
- Não pergunte um por um. Consulte em conjunto com SOQL.
- Não grave um por um. Agrupe os registros para DML.
- Não compare tudo contra tudo. Organize os dados para reduzir CPU.
- Não carregue tudo na memória. Selecione apenas o necessário.
O Salesforce não criou esses limites para atrapalhar quem desenvolve. Eles fazem parte da forma como a plataforma protege um ambiente compartilhado e incentiva soluções capazes de trabalhar com volume.
E, honestamente, quando você aprende a respeitar esses limites, seu código fica melhor em qualquer plataforma, não apenas no Salesforce.
Fontes oficiais para continuar estudando
Quer continuar aprendendo Salesforce e OmniStudio na prática?
Conheça meus conteúdos, o projeto OmniStudio 365 e o curso OmniStudio na Prática 2026.
Conhecer o OmniStudio 365