Salesforce is a powerful customer relationship management (CRM) platform that allows businesses to manage their sales, customer service, and marketing efforts. One of the key components of Salesforce is its database, which stores all of the data associated with a business’s customer and prospect interactions. To retrieve this data, Salesforce provides a query language called SOQL (Salesforce Object Query Language).

SOQL is similar to SQL, but it has some unique features that make it well-suited for querying data in Salesforce. However, like with any database, it is crucial to write efficient SOQL queries to ensure the performance of the system and avoid timeouts. In this blog post, we’ll discuss several tips for writing efficient SOQL queries in Salesforce.

Limit the number of fields returned

One of the most important tips for writing efficient SOQL queries is to only retrieve the fields that are necessary for your query. The more fields you retrieve, the more data needs to be transferred, which can slow down the query and consume more resources. To limit the number of fields returned, use the SELECT statement to specify only the fields you need.


 SELECT Id, Name, Phone FROM Contact

Use indexes:

Another way to improve query performance is to use indexed fields in the WHERE clause of your query. Indexing a field allows Salesforce to quickly locate the records that match the query criteria, which can greatly improve query performance. To use indexed fields in your query, include them in the WHERE clause.


 SELECT Id, Name FROM Contact WHERE LastName = 'Smith'

⓷ Limit the number of records returned

Another way to improve query performance is to limit the number of records returned by the query. This can be done using the LIMIT keyword, which specifies the maximum number of records that should be returned.


 SELECT Id, Name FROM Contact LIMIT 50

⓸ Use filtering

To narrow down the query results by only returning the records that meet certain criteria, use filtering. Filtering allows you to specify conditions that must be met for a record to be included in the query results.


 SELECT Id, Name FROM Contact WHERE Account.Industry = 'Technology'

⓹ Use SOQL for loops

When you need to query a large number of records, it’s best to use a SOQL for loop to query them in smaller batches, rather than querying all at once. This can help to prevent timeouts and improve query performance.


for (List<Contact> conList : [SELECT Id, Name FROM Contact LIMIT 2000]) {
  // process each contact in the list

⓺ Use aggregate functions

Instead of returning all the records themselves, use aggregate functions like COUNT() and SUM() to return summarized information about a set of records. This can greatly improve query performance and reduce the amount of data transferred.


 SELECT COUNT(Id), SUM(AnnualRevenue) FROM Account

⓻ Use the explain plan

The explain plan feature allows you to understand the performance of your query and identify any issues that need to be addressed.

Enable and Use the Query Plan Tool

  1. In the Developer Console, click Help | Preferences
  2. Set ‘Enable Query Plan’ to TRUE.

Once enabled in the Developer Console, you can access the Query Plan Tool in the ‘Query Editor‘ tab of the console.

To use the Query Plan Tool, simply enter a query in the Query Editor and press Query Plan to displays all query operations and the cost of each for the SOQL provided

The Benefits of Using the Query Plan Tool

Check the Query Plan for any SOQL queries that are taking too long to execute. It will give you information about the various plans and, if you have some of the filters indexed, the cost of using the index versus a full table scan.

If the cost of the table scan is less than the cost of the index and the query is timing out, you should look into using other filters to improve selectivity, or if you have another selective filter in that query that is not indexed but is a candidate for one.

Check out more details here.

⓼ Use bind variables

Use bind variables to pass values into a query, rather than hard-coding them, to improve query performance and security. Bind variables are placeholders in a query that are replaced with actual values at runtime. By using bind variables, you can reuse the same query with different values, which can improve performance and reduce the risk of SQL injection attacks.


 String lastName = 'Smith';
 List<Contact> contacts = [SELECT Id, Name FROM Contact WHERE LastName = :lastName];

⓽ Use subqueries

To retrieve related data in a single query, use subqueries instead of making multiple, separate queries. A subquery is a query that is nested within another query and returns a set of records that can be used as a filter in the main query. This can improve query performance and reduce the amount of code needed to retrieve related data.


 SELECT Id, Name, (SELECT Id, ProductCode FROM OpportunityLineItems) FROM Opportunity

⓵⓪ Use the developer console

Finally, use the developer console to run and test your queries. The developer console provides a user-friendly interface for running SOQL queries, and it also has several debugging and performance-tuning tools that can help you optimize your queries.

In conclusion, writing efficient SOQL queries in Salesforce is crucial for maintaining the performance of your system. By following these tips, you can improve query performance, reduce the amount of data transferred, and avoid timeouts. Remember, query performance is not only important for improving the user experience but also to avoid hitting the governor limits of Salesforce and causing errors in the system.

About the blog

SFDCLessons is a blog where you can find various Salesforce tutorials and tips that we have written to help beginners and experienced developers alike. we also share my experience and knowledge on Salesforce best practices, troubleshooting, and optimization. Don’t forget to follow us on:


Subscribe to our email newsletter to be notified when a new post is published.