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.

Por Monique da Silva · 21 de julho de 2026 · 7 min de leitura

Governor Limits no Salesforce representados por controles de recursos em um ambiente de tecnologia

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.

Governor Limits protegem os recursos compartilhados da plataforma.
Antes de continuar: os valores abaixo são para uma transação Apex síncrona. Alguns limites são diferentes em execuções assíncronas e existem outros limites além dos quatro apresentados aqui.

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
];
Regra segura para quem está começando: evite SOQL dentro de loops. Organize os dados antes e faça consultas em conjunto, prática conhecida como bulkificação.

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.

Não confunda os limites: inserir uma lista conta como uma instrução DML, mas a quantidade total de registros processados por DML também possui um limite próprio. Agrupar não torna o volume infinito.

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

LimiteO que controlaValor síncronoAnalogia
SOQLConsultas ao banco100Pedidos ao bibliotecário
DMLInstruções de escrita150Entregas no balcão
CPU TimeTempo de CPU10 segundosTempo de prova
Heap SizeMemória usada6 MBTamanho da mesa

O padrão que salva sua vida

Se você reparou, os quatro limites se resumem a um princípio:

Seja eficiente. Faça mais com menos.
  • 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.

Qual desses limites mais confundiu você quando começou a estudar Apex?

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

Sobre a autora

Sou Monique da Silva, desenvolvedora Salesforce com atuação em OmniStudio/Vlocity. Atualmente estou desenvolvendo skills em Agentforce, Apex, LWC e Revenue Cloud.

Uso este espaço para compartilhar conteúdo prático sobre Salesforce e conectar minha experiência profissional com o que estou estudando sobre arquitetura de software e soluções com IA.

Não sou dona da verdade. Se você não concorda ou tem algo para contribuir, comente e vamos aprender juntos.