Today, we will talk about Governor limits in Salesforce and how to solve them. Governor Limits are a Salesforce developer’s biggest challenge. That is because if the Apex code ever exceeds the limit, then Salesforce throws the governor limit and issues a run-time exception that cannot be handled. Hence, as a Salesforce developer, you must be very careful while developing your application.
What is Governor Limit in Salesforce?
In Salesforce, it is the Governor Limits that control how much data or how many records you can store in the shared databases. Because Salesforce is based on the concept of multi-tenant architecture. In simple words, Salesforce uses a single database to store the data of multiple clients/ customers.
To ensure no single client monopolizes the shared resources, Salesforce introduced the concept of Governor Limits in Salesforce, which is strictly enforced by the Apex run-time engine.
Types of Governor Limits in Salesforce
There are different types of governor limits in Salesforce. Here is a list of other type of governor limit in Salesforce.
- Per-Transaction Apex Limits: These limits count for each Apex transaction. For Batch Apex, these limits reset for each execution of a batch of records in the execute method.
- Force.com Platform Apex Limits: These limits aren’t specific to an Apex Transaction and are enforced by the Lightning platform.
- Static Apex Limits: Apex Limits that are applied across all transactions
- Size-Specific Apex Limits: Apex Limits related to the size of code.
- Miscellaneous Apex Limits
- Email Limits
- Push Notification Limits
Learn more about all of them on Execution Governors and Limit post.
Salesforce Governor Limits Cheat Sheet
Here are some critical Salesforce.com governor limits that you should know when planning to enter the Salesforce field or working on some Salesforce project. Here are different types of governor limits.
Per-Transaction Apex Limits
Description | Synchronous Governor Limit | Asynchronous Limit |
Total number of SOQL queries issued1 | 100 | 200 |
Total number of SOSL queries issued in Salesforce | 20 | |
Total number of DML statements issued | 150 | |
Total number of records retrieved by a single SOSL query | 2000 | |
Total number of records retrieved by SOQL queries | 50000 | |
Total number of records retrieved by Database.getQueryLocator | 10000 | |
Total heap size | 6 MB/12 MB | |
Maximum cumulative timeout for all callouts (HTTP requests or Web services calls) in a transaction | 120 seconds | |
Maximum number of Apex jobs added to the queue with System.enqueueJob | 50 | 1 |
Maximum CPU time on the Salesforce servers5 | 10,000 milliseconds | 60,000 milliseconds |
Static Apex Limits
Description | Limits |
The default timeout of callouts (either HTTP requests or Web services calls) in a transaction | 10 seconds |
The maximum size of the callout request or response (either HTTP request or Web services call) | 6 MB for synchronous Apex or 12 MB for asynchronous Apex |
The maximum SOQL query runtime before Salesforce cancels the transaction | 120 seconds |
The maximum number of class and trigger code units in the deployment of Apex | 7500 |
Apex trigger batch size | 200 |
For loop list batch size | 200 |
The maximum number of records that are returned for a Batch Apex query in Database.QueryLocator | 50 million |
Advantages of Governor Limits in Salesforce
Why did Salesforce introduce the Salesforce governor limit? It has some advantages. Let’s learn them in detail.
- Governor limits in Salesforce prevent other org from using and, hence, executing lengthy code, which can take up a lot of space in the memory and even the entire cloud CPU.
- Apex has wholly different or unique coding limits.
- These governor limits help us stay in the right coding space with Apex.
How to overcome governor limits in Salesforce
As much as Salesforce developers need to know all the relevant Governor Limits, it is also essential for them to understand how to overcome Governor Limits in Salesforce. There are certain Apex best practices you can follow to avoid these limits.
As developers, we must ensure that our code is scalable and does not exceed the governor’s limits. Let’s understand how we can overcome the governor limit with some examples. The most well-known limits are those around SOQL and DML limits in a single transaction.
1. System limit exception too many SQL queries 101
In Salesforce, we can encounter the Salesforce Governor Limits system limit exception to too many SQL queries 101 very often. System limit exception too many soql queries 101 is a governor limit set by Salesforce. This is a hard limit, so you can’t increase it by contacting Salesforce support.
How to fix Too Many SOQL queries: 101 error
What this error means, and how can we go about solving it? Here is one example of code that can introduce Too many SOQL query errors when inserting more than 200 records in Salesforce.
trigger ContactTrigger on Contact (before insert) {
if (Trigger.isInsert) {
for(Contact c : Trigger.new) {
Account accList= [SELECT Id, Name FROM Account WHERE Id =: c.AccountId];
c.LastName = accList.Name;
}
}
}
Why will we get an SOQL 101 error? Because we are using SOQL query inside the for loop. Let’s see how to resolve this System.LimitException: Too many SOQL queries: 101 error.
- Do not have DML statements or SOQL queries in our FOR loop.
- Use the collection to avoid SOQL inside the for-loop
- Bulkify Apex Trigger and follow the Trigger framework to avoid the recursive issues in your code
- Potentially move some business logic into the future.
- Since the database time is not calculated in CPU time, it is always better to explore the usage of aggregate SOQL for your business use case.
Learn more about How to Resolve the System.limitException: Too many SOQL Queries 101.
2. DML 150 Limit
The 2nd most well-known Salesforce governor limit concerns the number of DML operations in a single transaction. As per the docs, the limit is 150. Here is one simple code that will give you the “Too Many DML Statements: 151” error.
for (Integer i = 0; i < 150; i++){
Account accountObject = new Account();
accountObject.Name = 'Test ' + i;
insert accountObject ;
}
How to fix Too Many DML Statements: 151
You should not use a DML statement inside for loops and leverage collections to store the data, and then when you do a DML operation on a collection, it only counts as one DML!
List<Account> accountList = new List<Account>();
for (Integer i = 0; i < 150; i++){
Account accountObject = new Account();
accountObject.Name = ‘Test ‘ + i;
accountList.add(accountObject);
}
insert accountList;
3. Apex CPU Time Limit Exceeded
Salesforce CPU time limits usage to 10 seconds for synchronous transactions and 60 seconds for asynchronous processing. “Apex CPU time limit exceeded” error means your transaction is taking too long and can’t be completed.
How to resolve CPU Timeout Error in Salesforce
- Write one Trigger per object
- Avoid using Process Builder
- Use one flow per object and per event
- Avoid nested for loop
- Stop Recursion in Apex Code.
Learn more about Apex CPU Time Limit Exceeded.
4. Too many Query rows
You will get LimitException: Too many query rows: 50001
error when your query returns more than 50,000 records. Solution: Use Limit and filter in your SOQL query.
Learn more about Different types of Exceptions in Salesforce.
Overcome Salesforce Governor Limits Using Platform Events
Mixed DML’S Operations, Too Many SOQL Queries, Too Many DML Statements, CPU Timeout: Salesforce’s Governor limits are there for a reason, but even when you employ best practices, you may still exceed them. A good developer will look at all tools available on the platform and find the best approach to solving the problem they are facing.
Check out our old session on how to overcome with Salesforce governor limit using platform events.
Also, learn about how to log the Exception using Platform Events.
Summary
There are many different types of governor limits in Salesforce. Some general patterns and Apex best practices can help you stay out of governor limits. The most well-known limits are those around SOQL and DML limits in a single transaction.
We can see some of Synchronous Governor Limit and Asynchronous Limit are same.
when are saying Asynchronous Limit which apex function are involved.
i am asking this question because Database.getQueryLocator returning 10000 records in synchronous and Asynchronous. but Batch apex ( which is Asynchronous) returning upto 50m records ?