您位於此處:
避免 CPU 限制的大量記錄處理範例
瞭解如何重構流程,以使用防止 APEX_CPU_TIME_LIMIT_EXCEEDED 錯誤的大量處理模式。此範例示範低效率與最佳化流程設計之間的差異。
必要版本
| 檢視支援的版本。 |
| 所需的使用者權限 | |
|---|---|
| 若要使用 Flow Builder 中所有可用的流程類型、元素和功能 (包括 Einstein 和 Agentforce for Flow) 來開啟、編輯、建立、啟用或停用流程: | 管理流程 |
此範例顯示如何將在迴圈內執行「資料操作語言」(DML) 的流程轉換為有效處理記錄的大量流程。檢視之前和之後的比較,並瞭解流程大量處理的原則。
實例
建立記錄觸發流程,在機會結束時執行。針對每個已結束成交的機會,流程會為機會小組的每個成員建立追蹤工作。流程:
- 取得所有機會小組成員。
- 建立指派給每個小組成員的工作。
- 即使使用者一次更新多個機會,仍有效運作。
- 避免大量作業期間發生 APEX_CPU_TIME_LIMIT_EXCEEDED 錯誤。
Salesforce 會為每個同步交易強制執行 10,000 毫秒 (10 秒) 的單一 CPU 時間限制。該交易中的每個自動化 (Apex 觸發、流程、工作流程規則和程序) 都會從相同的預算中提取。流程設計效率不佳會加強問題。交易中的其他自動化項目會先減少共用預算,而效率不佳的流程會耗用超過必要的剩餘預算。
流程執行的順序取決於流程類型。此範例使用儲存後記錄觸發流程,其會依儲存前流程的順序執行。如需執行指示的詳細資料,請參閱「觸發和執行順序」。
效率不佳方法:迴圈內的 DML 作業
此方法會在處理多個機會時造成 CPU 限制錯誤。
流程結構:流程會從「機會」物件上的「記錄觸發流程」開始,當「階段」等於「已結束成交」時,該流程會在記錄更新後執行。流程會使用「取得記錄」取得觸發記錄的「機會小組成員」,然後循環完成集合。在迴圈內,「建立記錄」元素會為每個小組成員建立一個工作。
此方法失敗的原因:
- 每個迴圈迭代都會執行個別的 DML 作業。
- 具有 5 個小組成員的機會會產生 5 個 DML 作業。
- 當使用者一次更新 20 個機會時,流程會在一個交易中處理所有機會。
- 20 個機會 × 每個小組成員 = 100 個 DML 作業在一個交易中。
- 100 個 DML 作業的累積 CPU 時間超過管理員限制。
- 結果:APEX_CPU_TIME_LIMIT_EXCEEDED 錯誤。
有效率方法:以集合為基礎的大量處理
無論記錄量為何,此方法都能有效率地處理記錄。
流程結構:流程會從「機會」物件上的記錄觸發流程開始,並使用「取得記錄」取得「機會小組成員」。流程會建立「工作」記錄變數和「工作」記錄集合變數。記錄變數會保留流程正在處理的目前工作,而記錄集合會保留要建立的工作。流程會循環完成小組成員。在迴圈內,「指派」元素會透過設定「工作」記錄變數的值來建立每個工作記錄,並將工作與迴圈中的目前小組成員相關聯。其他「指派」元素會將「工作」記錄變數值新增至「工作」記錄集合。迴圈完成後,單一「建立記錄」元素會從集合建立所有工作。
為何運作:
- 迴圈會建立工作記錄的集合,而無須執行 DML 作業。
- 迴圈完成後只會進行一個 DML 作業。
- 具有 5 個小組成員的機會仍只會產生 1 個 DML 作業 (一次建立 5 個工作)。
- 當使用者一次更新 20 個機會時,流程會執行 20 個 DML 作業 (每個機會一個)。
- 明顯減少 CPU 時間消耗。
- 結果:流程在未達到管理員限制的情況下順利完成。
績效比較
| 實例 | 效率不佳 (迴圈中的 DML) | 有效 (大量處理) |
|---|---|---|
| 1 個包含 5 個小組成員的機會 | 5 個 DML 作業 | 1 個 DML 作業 |
| 20 個機會 (大量更新),每個小組成員有 5 個 | 100 個 DML 作業 (可能會因 CPU 限制錯誤而失敗) |
20 個 DML 作業 (成功完成) |
| 100 個機會 (資料載入),每個小組成員為 3 個 | 300 個 DML 作業 (絕對失敗) |
100 個 DML 作業 (成功完成) |
大量處理的重要原則
- 切勿在迴圈內執行 DML 作業。一律在迴圈期間收集集合變數中的記錄,然後在迴圈完成後執行 DML。
- 從頭開始進行大量作業的設計。假設記錄觸發流程同時處理多個記錄。
- 使用記錄集合變數。集合型 DML 作業的效率高於個別作業。
- 使用實際量的測試。一個記錄的除錯模式不會顯示大量作業問題。使用「資料匯入精靈」、「Data Loader」或大量更新進行測試。
- 監視效能。檢閱除錯記錄,以識別在流程在生產環境中失敗之前接近管理員限制的流程。
高階步驟
檢閱此範例中的步驟。請依序遵循,或前往一個區段以取得更明確的指示。
- 建立流程
設定記錄觸發流程,以在機會結束時執行。 - 建立資源
建立大量處理所需的變數。 - 取得小組成員
使用「取得記錄」元素取得「機會小組成員」記錄以供處理。 - 新增要檢查小組成員的決策
新增「決策」元素,以避免在沒有小組成員時處理。 - 新增迴圈元素
新增迴圈元素以迭代小組成員。 - 在迴圈內建立工作記錄
針對迴圈內的每個小組成員填入 TaskRecord 記錄變數的欄位值。 - 將工作新增至集合
將每個工作記錄新增至 TasksToCreate 集合變數以進行大量建立。 - 在迴圈後建立所有工作
使用單一「建立記錄」元素可在一個作業中建立所有工作。 - 新增錯誤處理
設定錯誤管理,以捕捉並報告錯誤。 - 使用大量資料進行測試
測試大量處理流程需要模擬大量作業。 - 更多最佳化技術
使用這些技術進一步最佳化大量處理的流程。 - 轉換現有流程
在迴圈中使用「資料操作語言」(DML) 作業將流程轉換為大量模式。
建立流程
設定記錄觸發流程,以在機會結束時執行。
-
開啟「流程」清單檢視。
- 進入「設定」,在「快速尋找」方塊中,輸入流程,然後選取「流程」。
- 進入「自動化」應用程式,選取「流程」 索引標籤。
- 從任何 Lightning 應用程式的「流程」 索引標籤中,按一下動作功能表,然後選取「開啟流程」。
-
建立記錄觸發的流程。
- 進入「自動化 Lightning」應用程式,按一下「新增」。搜尋並選取「記錄觸發流程」。
- 進入「設定」,按一下「新增流程」,搜尋並選取「記錄觸發流程」。
「設定開始」面板隨即開啟。 -
設定「開始」元素。
- 針對「物件」,選取「機會」。
- 針對「觸發流程的時機」,選取「記錄已更新」。
- 在「設定項目條件」區段中,針對「條件需求」,選取「符合所有條件 (AND)」。
- 針對「欄位」,選取「階段」。
- 針對「運算子」,選取「等於」。
- 針對「值」,選取「已結束成交」。
- 針對「最佳化流程」,選取「動作與相關記錄」。
建立資源
建立大量處理所需的變數。
-
若要建立每個工作,請建立記錄變數以建立工作記錄。
-
若要開啟「工具箱」,請按一下「
」。
- 按一下「新增資源」,然後選取「變數」。
- 針對「API 名稱」,輸入 TaskRecord。
- 針對「資料類型」,選取「記錄」。
- 針對「物件」,選取「工作」。
- 按一下「完成」。
-
若要開啟「工具箱」,請按一下「
-
若要儲存所有工作,請為所有工作建立記錄集合變數。
- 按一下「新增資源」,然後選取「變數」。
- 針對「API 名稱」,輸入 TasksToCreate。
- 針對「資料類型」,選取「記錄」。
- 針對「物件」,選取「工作」。
- 選取以 允許多重值 (集合)。
- 按一下「完成」。
取得小組成員
使用「取得記錄」元素取得「機會小組成員」記錄以供處理。
-
按一下
,然後選取「搜尋並取得 記錄」。
-
設定元素。
- 針對「標籤」,輸入 取得機會小組成員。
-
針對「物件」,選取「機會連絡人角色」。
在此範例中,流程會將小組成員儲存在「機會連絡人角色」物件中。將機會連結至連絡人的物件。
- 在「篩選機會連絡人角色記錄」區段中,針對「欄位」選取「機會識別碼」。
- 針對「運算子」,選取「等於」。
- 針對「值」,選取「觸發機會」,然後選取「機會識別碼」。
- 針對「要儲存多少記錄」,選取「所有記錄」。
- 針對「如何儲存記錄資料」,選取「自動儲存所有欄位」。
新增要檢查小組成員的決策
新增「決策」元素,以避免在沒有小組成員時處理。
-
按一下
,然後搜尋並選取「決策」。
-
設定決策。
- 針對「標籤」,輸入「尋找小組成員?」。
- API 名稱會自動填入。
- 針對「成果標籤」,輸入 是。
- API 名稱會自動填入。
- 針對「資源」,選取「取得機會小組成員中的 機會連絡人角色」。
- 針對「運算子」,選取「為 Null」。
- 針對「值」,選取「False」。
- 按一下「預設結果」。
- 針對「標籤」,輸入 否。
新增迴圈元素
新增迴圈元素以迭代小組成員。
-
在「是」路徑中,按一下
,然後搜尋並選取「迴圈」。
-
設定迴圈。
- 針對「標籤」,輸入 反覆透過小組成員。
- API 名稱會自動填入。
-
針對「集合變數」,選取「取得機會小組成員中的 機會連絡人角色」。
即使此資源包含多個記錄,仍會顯示為單數。
- 針對「方向」,選取「第一個項目到最後一個項目」。
在迴圈內建立工作記錄
針對迴圈內的每個小組成員填入 TaskRecord 記錄變數的欄位值。
-
在「針對每個項目」之後,按一下
,然後搜尋並選取「指派」。
-
設定指派。
- 針對「標籤」,輸入 建立工作記錄。
- API 名稱會自動填入。
- 針對「變數」,選取「TaskRecord」,然後選取「主題」。
- 針對「運算子」,選取「等於」。
- 針對「值」,輸入「跟隨已結束的機會」。
- 按一下 + 新增指派。
-
繼續新增指派並設定值。
資源 運算子 值 TaskRecord>狀態 等於 未開始 TaskRecord>priority 等於 高 TaskRecord>指派對象識別碼 等於 來自迴圈>連絡人識別碼的目前項目 TaskRecord>與識別碼相關 等於 觸發機會>機會識別碼
將工作新增至集合
將每個工作記錄新增至 TasksToCreate 集合變數以進行大量建立。
-
在「指派」元素之後,仍在迴圈中,按一下
,然後搜尋並選取「指派」。
-
設定指派。
- 針對「標籤」,輸入 新增工作至集合。
- 針對「變數」,選取「TasksToCreate」。
- 針對「運算子」,選取「新增」。
- 針對「值」,選取「TaskRecord」,然後選取「整個資源」。
在迴圈後建立所有工作
使用單一「建立記錄」元素可在一個作業中建立所有工作。
-
迴圈結束後,按一下
,然後搜尋並選取「建立記錄」。
-
設定元素。
- 針對「標籤」,輸入 建立所有工作。
- 針對「如何設定記錄欄位值」,選取「從記錄變數」。
- 針對「要建立多少記錄」,選取「多個」。
- 針對「記錄集合」,選取「TasksToCreate」。
- 儲存流程。
- 針對「標籤」,輸入「為機會小組成員建立工作」。
- API 名稱會自動填入。
新增錯誤處理
設定錯誤管理,以捕捉並報告錯誤。
-
若要管理錯誤,請將錯誤路徑新增至「建立記錄」元素。
- 按一下「建立所有工作」元素上的三個點,然後選取「新增錯誤路徑」。
-
若要通知 Salesforce 管理員錯誤路徑失敗,請新增「傳送電子郵件」動作。
-
在錯誤路徑上,按一下
,然後搜尋並選取「傳送電子郵件」。
- 針對「標籤」,輸入 通知管理員有關錯誤。
- API 名稱會自動填入。
- 針對「收件者地址」,輸入您要接收通知之人員的電子郵件地址。
- 針對「主題」,輸入需要注意的 流程
- 針對「內文」,輸入「機會小組成員 的建立工作」流程發生錯誤。以下是錯誤:.
- 按一下「插入資源」。
- 選取「執行中流程」,然後選取「錯誤訊息」。
-
在錯誤路徑上,按一下
- 儲存您的工作。
使用大量資料進行測試
測試大量處理流程需要模擬大量作業。
- 若要測試個別記錄,請使用除錯模式更新一個機會,並確認流程正確建立工作。
- 啟用流程。
-
若要在 Sandbox 中測試大量作業,請使用「資料匯入精靈」、「Data Loader」或清單檢視一次更新多個機會。
- 建立 10 到 20 個測試機會。
- 將小組成員新增至每個機會。
- 使用 Data Loader 或大量更新,同時將所有機會的階段變更為「已結束成交」。
- 確認流程建立所有工作且沒有錯誤。
- 若要驗證效能,請檢閱 Apex 除錯記錄,以確認 CPU 耗用時間在可接受的限制內。
更多最佳化技術
使用這些技術進一步最佳化大量處理的流程。
使用項目條件限制執行
將條件新增至流程「開始」元素,以確保流程僅在必要時執行。例如,僅處理超過特定金額或來自特定記錄類型的機會。
針對非重要作業考量儲存後
儲存後記錄觸發流程可以在您儲存機會後建立後續工作。其會非同步執行,且管理員限制較高。
大量批次流程
如果機會定期有數十個小組成員,請使用已排程流程,以批次方式處理已結束機會,而非即時處理。
轉換現有流程
在迴圈中使用「資料操作語言」(DML) 作業將流程轉換為大量模式。
如果您有具有迴圈中 DML 作業的現有流程,請遵循下列步驟進行轉換。
- 若要尋找迴圈中的 DML 作業,請識別迴圈內的所有「建立記錄」、「更新記錄」和「刪除記錄」元素。
-
針對每個 DML 元素執行轉換。
- 若要建立記錄,請為該物件類型建立記錄變數。
- 若要儲存您要處理的記錄,請為該物件類型建立記錄集合變數。
- 若要儲存記錄的欄位值,請使用「指派」元素將值指派給記錄變數。
- 若要收集要處理的記錄,請使用「指派」將記錄變數新增至記錄集合。
- 若要有效率地建立記錄,請在迴圈之後新增一個處理整個記錄集合的 DML 元素。
- 若要確認轉換,請使用大量資料進行完整測試,以確認重新產生是否正確運作。

