"Bulkify Your Code" - Explanation of Salesforce' Governor Limit with Use Case

Bulkify Your Code” – I am quite sure you have heard this phrase a lot, but do you really know what is the meaning of this phrase and why this one is so important?

This post is all about “Bulkify Your Code” where I will explain –
  • What is the meaning of this phrase?
  • Why this is so important?
  • Explain with Use Cases
So let’s start with What is the meaning of “Bulkify Your Code” –
If you want to combine repetitive tasks in your Apex classes/Triggers, you need to bulkify your code.
For example – if you are given a task to check whether a student’s score is greater than 80, you can’t write a code which can check score of single student. Rather your code should check score of n number of students.
So it means you need to repeat the same task of checking score for n number of students in your apex code and that is what called “Bulkify Your Code”

So now definitely the question that came to your mind – Why “Bulkify Your Code” is so important?
To explain the important, let me give you a real-life example. Say for example, you are staying in an apartment where along with your family, 100 other families are also staying. Each of these families (including your definitely) need water, right? To fulfil this requirement, what the owner will do is that he/she will install same size (I mean the same dimension) of pipes for each family to equally distribute the water.

Exactly the same concept applies for Salesforce. Salesforce’s in based on Multi-Tenant Architecture. So Salesforce needs to make sure that when you are running your piece of code, it should not hamper other’s piece of code (in terms of performance, availability of resources etc.) To explain in more details – Say Company A and Company B both are running their applications in Salesforce. Now at the particular time instance, Company A is running 1000 SOQL queries, whereas Company B is running only 5 queries. Definitely running 1000 queries will take more resources compared to 5 queries and as a result Company B will feel bad performance. Now Salesforce is a non-biased architecture (Yes, I use this term). So Salesforce will make sure Company A and Company B will get the same share. To achieve this Salesforce comes up with Governor Limit.

Governor Limit will make sure that as developer you are writing efficient and scalable code. Now why I love Salesforce a lot and why I call Salesforce a non-biased architecture, because even if you pay more to Salesforce, they will never increase the limit. The only workaround is to write efficient code. Superb. Salesforce rocks!!!!

Use Case:
I have the below two custom objects in my org with field details as per the below screenshot 
My requirement is that if an Airport record is having the Operational checkbox true, then create a country record where Country.Country Name = Airport.Country. Very simple right!!!
But this can lead to many problems.

So let's write the trigger for that first -
trigger AirportTrigger on Airport__c (after insert) {
    for(Airport__c anAirport : Trigger.new){
            Country__c aCountry = new Country__c(
            insert aCountry;

Very simple trigger. What the trigger is doing is simple iterating over Trigger.new (it is returning a list of Airport records that are getting inserted) and checking whether the Operational__c field is true or not. If true, then creating a new Country record with Country name same as airport's country name.

This trigger will work fine when you create a single airport record from Salesforce, because, in that case, Trigger.new will return you only 1 record and which will perform max 1 DML operation (when Operational__c is true). 

But the problem will occur when we will insert multiple airport records with import wizard. 

Now what I will do is that I will prepare a csv file with 1000 airport records in the below fashion.
Now if I try to import these 1000 airport records with import wizard, below is what I am getting -
Now when I checked the debug log, below is the error message I am getting -
Ok - got it!!. So we are getting the error "Too many DML statements". This is the Governor Limit set by Salesforce, which states as a developer you can execute at max 150 DML statements. But what we are doing is -

When we tried to import 1000 new airport records, Trigger.new did batch up mass insert upto 200 records at a time. Each of  these 200 records executed one new insert statement for Country object. So total number of DML operation becomes 200, which is beyond the Salesforce's Governor Limit (150 DML Operations). 

Now let's play more with Salesforce Governor Limit and change the import file like below -

As you can see here, I have changed Operational field alternatively. Now when I tried to import this file(File contains 1000 Airport records), below is what I am getting -
Success!! Do you know the reason for the success. Ok. Let me tell you. 

Trigger.new again did the batch up of mass insert upto 200 records at a timebut out of these 200 records, only 100 records were having Operational__c field set as true. So total number of DML operation were 100 which was within Salesforce's Governor Limit.

But still our code is not efficient as with this code, we can't insert 1000 records (our first csv files). So we have to make our code efficient and the way we can do that is -
trigger AirportTrigger on Airport__c (after insert) {
    List<Country__c> allCountries = new List<Country__c>();
    for(Airport__c anAirport : Trigger.new){
            Country__c aCountry = new Country__c(
    if(allCountries.size() > 0){
Now with the above code, when I tried to insert 1000 airport record with Operational__c field set to true for all, below is what I am getting -

Great!! So the code is now efficient and can handle any number of insert. The changes we did are as follows -

  • Created a list which will hold all the country records which need to be inserted into Salesforce org.
  • Finally if the size of the list is greater than 0, then execute Database.insert which will insert all the country records.
The advantage with this approach is that we are executing only 1 DML operation.

Hope this will help you to understand Salesforce's Governor Limit. Any question, please let me know. Thanks.

Please check my next post with another example - 
"Bulkify Your Code" - Another Example with Use Case

No comments:

Post a Comment

Follow Me

Enter your email address:

Delivered by FeedBurner

Popular Posts


Salesforce (105) Apex (46) admin (27) visualforce (21) ADM (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) SOAP (13) lightning (13) tutorial (11) Certification. (10) javascript (10) Kitchener Developer Group (8) Certification (7) Trigger (7) test class (7) unit testing (7) Advanced Admin (6) Sharing and Visibility (6) design pattern (6) developer (6) report (6) salesforce release (6) security (6) service cloud (6) trailhead (6) Advanced Apex (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) formula (5) mobile (5) solution management (5) use case (5) JSON (4) Kitchener User Group (4) Lightning Experience (4) Sales Cloud (4) Salesforce DX (4) Tips (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) event (4) github (4) html (4) polymer (4) profiles (4) responsive (4) tdd (4) ui (4) Architect (3) Lightning Web Component (3) Live Chat (3) Online Event (3) Opportunity (3) Performance (3) Products (3) REST (3) Role (3) Salesforce Certification (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Web Technology (3) automation tool (3) dynamic apex (3) license (3) map (3) mapbox (3) singleton (3) version controlling (3) Asynchronous callout (2) Bulkify (2) Community (2) Data Architecture and Management Certification (2) Devops (2) Distributed Version Controlling (2) ES6 (2) Eclipse (2) Einstein (2) Enterprise Territory Management (2) Financial Services Cloud (2) Force.com IDE (2) Governor Limit (2) Groups (2) IBM (2) Implicit Sharing (2) JourneyToCTA (2) Lightning Design System (2) Live Agent (2) Metadata (2) PD II (2) Price Book (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) Virtual Event (2) ant (2) basic (2) chatter (2) coding (2) communication (2) console (2) controller (2) documentation (2) dreamforce (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) release (2) salesforce1 (2) strategy (2) xml (2) Action Plan (1) Action Plan Template (1) Activity Timeline (1) Advanced Currency (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) AppExchange (1) Arrow (1) Article (1) Asynchronous Apex (1) Aura Framework (1) Batch (1) Bots (1) Browser (1) Bulk data load (1) CTA (1) Calendar (1) Canon (1) Case Management (1) Celebration (1) Cheat Sheet (1) Classic (1) Compare (1) Confetti (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) CumulusCI (1) Custom Metadata (1) Custom Object (1) Customer (1) Dated Exchange Rate (1) Decorator Design Pattern (1) Dev Hub (1) Development (1) Diwali (1) EDA (1) Education Cloud (1) Email (1) FSC (1) Function (1) Future (1) Global Gathering (1) Goals (1) Guest Access (1) Guest Profile (1) Guest User Sharing Rule (1) Guide (1) HEDA (1) Higher Education (1) Household (1) Ideas (1) Improvement (1) KPIs (1) Knowledge Management (1) Large Data Volume (1) LastModifiedDate (1) Lightning Feature (1) Manage Currencies (1) Manual Sharing (1) Metrics (1) Multi Currency (1) New (1) New Feature (1) OOPS (1) OWD (1) Omni-Channel (1) Partner (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Platform Developer II (1) Presentation (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) Queueable (1) QuickReference (1) Related records (1) Reports (1) Retrieve (1) Role Hierarchy (1) SAL (1) SFDX (1) Salesforce Advisor Link (1) Salesforce Labs (1) Salesforce Optimizer (1) SalesforceDx (1) Schedule (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Spring 20 (1) Summer14 (1) Summer16 (1) Summer19 (1) Switch (1) SystemModStamp (1) Timeline (1) Unauthorized Access (1) User License (1) Users (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (1) actionFunction (1) actionPoller (1) actionRegion (1) actionSupport (1) agile (1) app (1) approval process (1) aura (1) awesome (1) backup (1) bitbucket (1) book (1) campaign (1) change set (1) code (1) code coverage (1) configuration (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) duplicate (1) dynamic (1) equals (1) error (1) field-level security (1) folder (1) ftp (1) generic (1) gift (1) global describe (1) hashcode (1) import wizard (1) jenkins (1) keynote (1) long running requests (1) monitoring (1) mysql (1) page layout (1) personal (1) power of one (1) record type (1) relationship (1) request (1) review (1) sub-tab (1) tab (1) username (1) visual workflow (1) workflow (1)

Total Subscribers

Total Pageviews

Contact Me


Email *

Message *