Working with Very Large SOQL Queries

DEX455 - Apex SOQL 与 SOSL 查询完全指南

📄 第 185 页 🎬 视频课程

课程章节介绍

好,同学们,这节课我们来讲一个非常实用的话题——当我们用SOQL查询数据时,如果数据量太大,超出了堆内存的限制,程序就会报错,那该怎么办呢? 假设你写了一个查询,返回了几万条甚至更多的记录,这些记录一股脑全装进一个列表里,很可能会把内存撑爆。这时候,我们可以换一种写法,叫做SOQL查询循环,也就是在for循环里直接使用查询语句。 Apex里,for循环可以直接写 `for (单个变量 : [SOQL查询])`,这样底层会自动分批获取记录,通过内部调用 query和queryMore方法,避免了一次性加载所有数据。而且,这种写法还分两种情况: 第一种,是使用单一对象的格式,也就是直接在循环里拿到的是一条条记录。这种写法适合循环体内不需要进行DML操作,也就是增删改查之外的逻辑处理。 第二种,是使用列表的格式,比如 `for (List 一批记录 : [SOQL查询])`,每次循环给你200条记录。这种写法最适合需要执行DML操作的情况,因为DML每次调用处理200条,刚好匹配,效率最高。 不过要注意,虽然用for循环可以解决堆大小的问题,但因为它要反复从数据库捞数据,可能会消耗更多的CPU时间。所以,如果你要进行大规模的数据更新,最好的办法还是用批量Apex,也就是Batch Apex,它天生就是为处理海量数据设计的,能够最大程度地避开各种调控限制。 简单总结一下:遇到大数据量SOQL,别急着装列表,试试for循环直连查询;无DML用单记录,有DML用列表批次;再大的量就用Batch Apex。记住了吗?

关键词

Apex Salesforce Developer Guide