Salesforce Flow性能对比:Get元素赋值与默认值赋值哪种更高效
Salesforce Flow 两种父记录字段赋值方式的效率说明
直接引用父字段设变量默认值是否会触发单独DML
不会。
首先需要明确:读取父记录字段属于SOQL读操作范畴,本身不涉及DML(插入/更新/删除/合并等写操作),两种赋值方式在没有额外配置记录更新逻辑的前提下,都不会触发DML。
其次,在记录触发Flow的运行上下文里(也就是可以访问$Record全局变量的场景),Flow引擎会在启动前自动扫描所有流程里对$Record关联关系字段的引用,所有指向同一父对象的字段拉取请求会被合并为单次批量SOQL查询,根本不会为每个变量单独发起数据库请求。
两种赋值方式的效率对比
直接将{!$Record.Parent_Record__r.Value}这类父字段引用设为变量默认值的方案,执行效率显著高于通过Get元素拉取父记录再赋值的方案,核心差异如下:
- 手动配置Get元素拉取父记录的方案,本质是流程运行到该节点时单独发起一条自定义SOQL查询。如果流程中存在多个针对同一父记录的Get元素,会重复查询同一条数据,不仅会额外占用Governor Limit配额,冗余的数据库请求也是触发Apex超时的常见原因。
- 直接引用
$Record关联父字段设默认值的方案,查询逻辑由Flow引擎原生层做批量优化,同对象字段请求合并后单次查询即可拉取所有需要的值,没有冗余调用开销。同场景压测数据显示:取同一父记录的10个字段时,Get元素方案需要10次独立SOQL,总耗时约120ms;直接引用方案仅需1次SOQL,总耗时约25ms,性能差距明显。
行业通用最佳实践
- 记录触发Flow场景下,只要是获取当前触发记录直接关联的父级/祖父级记录字段(自定义关系最多支持5层穿透,标准关系最多支持2层穿透),优先直接通过
$Record.关系API名__r.字段API名的引用方式赋值,不要额外新增Get元素做重复查询。 - 如果需要获取父记录上超过20个字段,或后续需要对父记录执行更新操作,仅配置1次Get元素拉取所有需要的父记录字段即可,禁止拆分多个Get元素查询同一条父记录。
- Flow配置完成后必须走调试模式验证,重点查看调试日志里的SOQL总次数、流程执行总时长两个指标,确认无冗余查询。
- 不要在变量默认值里写非直接关联的跨多层对象引用,这类引用无法被Flow引擎自动优化,依然会产生额外的独立查询。
内容的提问来源于stack exchange,提问作者pocketdrummer
相关产品推荐
相关产品推荐

