您位於此處:
疑難排解流程中的 APEX_CPU_TIME_LIMIT_EXCEEDED 錯誤
當交易耗用太多 CPU 時間時,Salesforce 會引發 Apex_CPU_TIME_LIMIT_EXCEEDED 錯誤。流程會將此限制與相同交易中的所有其他自動化共用,包括 Apex 觸發。
必要版本
| 檢視支援的版本。 |
| 所需的使用者權限 | |
|---|---|
| 若要使用 Flow Builder 中所有可用的流程類型、元素和功能 (包括 Einstein 和 Agentforce for Flow) 來開啟、編輯、建立、啟用或停用流程: | 管理流程 |
| 若要檢視「設定」並存取除錯記錄: | 檢視設定和組態 |
| 若要檢視、保留和刪除除錯記錄,以及設定追蹤標記: | 檢視所有資料 |
Salesforce 會為每個同步交易強制執行 10,000 毫秒 (10 秒) 的單一 CPU 時間限制。該交易中的每個自動化,例如 Apex 觸發、流程、工作流程規則和程序,都會從相同的預算中獲取。如果其他自動化首先耗用大部分的預算,即使已最佳化的流程也會失敗。執行順序取決於流程類型。如需完整訂單,請參閱「觸發和執行順序」。
- 儲存前流程的執行順序早於儲存後流程。
- Apex 觸發會根據觸發類型在流程之前或之後執行。
若要疑難排解和最佳化達到 CPU 時間限制的流程:
- 瞭解導致 CPU 限制錯誤的常見模式
- 識別使用最多 CPU 時間的元素
- 套用最佳化技巧來減少 CPU 耗用
- 實作預防指導方針以避免 CPU 限制錯誤
- CPU 限制錯誤的問題、解決方案和預防技術
識別常見的 CPU 限制問題、套用解決方案,並遵循預防技術來避免 APEX_CPU_TIME_LIMIT_EXCEEDED 錯誤。 - 識別流程中的 CPU 密集元素
使用 Apex 除錯記錄可找出流程中耗用最多 CPU 時間的元素。
CPU 限制錯誤的問題、解決方案和預防技術
識別常見的 CPU 限制問題、套用解決方案,並遵循預防技術來避免 APEX_CPU_TIME_LIMIT_EXCEEDED 錯誤。
此表格提供疑難排解 CPU 限制錯誤的參考。每一列都會描述常見問題、修正問題的解決方案,以及在未來流程中防止此問題的技巧。從判斷這些問題是否適用於您的流程開始。若無適用,則相同交易中的其他自動化 (例如 Apex 觸發、其他流程或工作流程規則) 會從相同的 CPU 預算中提取,且可能是罪魁祸首。若要識別整個交易中耗用 CPU 的項目,請檢閱 Apex 除錯記錄。如需詳細資料,請參閱 除錯記錄。
| 問題 | 解決方案 | 預防技術 |
|---|---|---|
資料操作語言 (DML) 迴圈內作業 在迴圈路徑內執行「建立記錄」、「更新記錄」或「刪除記錄」作業,會在每次反覆執行時耗用 CPU 時間。一次處理多個記錄,即可快速耗盡限制。 範例:流程會循環執行 100 個機會,並使用迴圈內的「建立記錄」元素為每個機會建立工作,進而產生 100 個個別的 DML 作業。 |
使用集合型資料操作語言 (DML) 作業 在迴圈內,使用「指派」元素將記錄新增至記錄集合變數。迴圈完成後,請使用單一「建立記錄」、「更新記錄」或「刪除記錄」元素一次處理整個集合。此方法稱為大量處理。 範例:在整個機會中循環進行,使用指派元素為每個機會建立工作。然後使用其他指派元素將每個工作新增至集合變數。在迴圈之後,使用「建立記錄」元素一次建立所有工作。 如需詳細資訊,請參閱交易中的大量處理。 |
請勿將 DML 作業放在迴圈內。一律設計流程以在迴圈期間收集集合變數中的記錄,然後在迴圈完成後執行 DML。 |
迴圈內的多個查詢 「取得迴圈內的記錄」元素會耗用大量 CPU 時間,特別是在查詢大型物件或使用複雜篩選時。 範例:流程會循環切換帳戶,並使用「取得記錄」在迴圈內取得每個帳戶的相關連絡人,進而為每個帳戶產生一個查詢。 |
迴圈前的查詢資料 在迴圈之前,請使用單一「取得記錄」元素,並使用取得相關記錄功能,以使用適當的篩選條件取得所有必要資料。在迴圈期間,請使用收集的資料,而非每個反覆查詢。如果您無法使用單一「取得記錄」元素,請使用「取得記錄」元素來取得主要記錄。接著,使用其他「取得記錄」元素取得次要記錄。使用記錄欄位、In 運算子和第一個「取得記錄」集合來篩選次要記錄。例如,「帳戶識別碼 > 進入 > 取得帳戶中的帳戶」。 範例:首先使用依帳戶識別碼篩選的「取得記錄」元素取得所有相關連絡人,然後在迴圈期間參照連絡人集合。 |
避免在迴圈內部進行查詢。進入迴圈之前,取得所有必要的資料。 |
迴圈中的複雜公式 在每個迴圈迭代上執行複雜公式計算的指派元素會累積 CPU 時間,特別是使用字串操作、日期計算或巢狀函數。 範例:流程會循環執行 500 筆記錄,每個迭代都會執行多個公式計算以衍生欄位值。 |
簡化公式 將複雜公式拆分為更簡單的步驟。計算迴圈外不會變更的值。盡可能避免嵌套函數。請考慮在物件上使用公式欄位,而非使用流程公式。 針對整個集合的作業 (例如篩選、對應或排序),轉換元素的執行效率高於迴圈。若要以單一查詢取得所有相關記錄,而非每個迴圈迭代使用一個查詢,請使用具有 IN 運算子的「取得記錄」元素。 如需詳細資訊,請參閱 轉換元素。 |
簡化公式並移動不會在迴圈外變更的計算。使用實際資料量測試公式效能。 |
處理大型記錄集合 在單一交易中處理數千筆記錄的已排程流程或批次作業 (即使進行正確大量處理) 可能會耗用太多 CPU 時間。 範例:排程流程會取得 5000 個帳戶記錄,並在更新每個記錄資料前對其執行複雜轉換。 |
使用替代方法 針對大型資料量,請考量:
|
提早篩選資料以減少處理的記錄數。使用「取得記錄」篩選條件僅取得您需要的記錄。部署至生產之前,請先使用實際的資料量進行測試。 |
交易中的多個流程 當一個流程觸發其他流程 (透過記錄變更或子流程) 時,交易中所有流程的累積 CPU 時間會計入限制。 範例:帳戶更新上的記錄觸發流程會執行多個子流程,也會在相關物件上觸發其他記錄觸發流程。 |
減少流程鏈 將相關自動化合併至較少的流程。檢閱您的流程觸發條件,以確保流程僅在必要時執行。考慮使用項目條件來限制記錄觸發流程何時執行。 |
檢閱所有可在相同交易中執行之自動化的累積影響 (流程、程序、工作流程、觸發)。監視並最佳化整個自動化鏈。 |
大量資料載入 在大量匯入或大量更新期間執行的記錄觸發流程需要有效處理所有記錄。低效率的流程在大量作業期間達到 CPU 限制,即使它們對個別記錄運作良好。 範例:使用者匯入 200 個帳戶記錄。儲存前記錄觸發流程會針對每個帳戶執行多個對應和計算。 |
最佳化大量作業
如需詳細資訊,請參閱 轉換元素。 |
一律假設記錄觸發流程同時處理多個記錄。在部署至生產環境之前,使用大量資料載入 (使用 Data Loader 或大量更新) 進行測試。若未正確設計,則適合個別記錄的流程可能會在大量作業期間失敗 (若未正確設計)。 |
一般預防指導方針
- 監視流程效能:定期檢閱 Apex 除錯記錄,以識別接近 CPU 限制的流程,即使其尚未失敗。定期監視可協助您在流程造成生產問題之前最佳化。
- 使用實際資料進行測試:使用實際資料量測試流程,以在啟用前發現效能問題。除錯模式通常會使用一個記錄進行測試,這不會顯示大量作業問題。
- 文件最佳化決策:使用元素描述記下您套用大量處理或其他最佳化的位置。此文件可協助未來維護人員瞭解設計,並防止意外產生效能問題。
- 開始簡單並最佳化:以小的增量建立流程,並在每個步驟測試效能。最佳化工作流程比修正複雜的中斷流程更容易。
識別流程中的 CPU 密集元素
使用 Apex 除錯記錄可找出流程中耗用最多 CPU 時間的元素。
- 前往「設定」,然後在「快速尋找」方塊中輸入 除錯記錄。
- 為遇到錯誤的使用者設定除錯記錄,或在除錯模式中執行流程。
- 執行流程以重現錯誤。
- 開啟產生的除錯記錄。
-
在除錯記錄中搜尋這些關鍵事件。
FLOW_CREATE_INTERVIEW_BEGIN- 顯示每個流程開始的時間FLOW_ELEMENT_LIMIT_USAGE- 顯示每個流程元素的 CPU 耗用時間CUMULATIVE_LIMIT_USAGE- 顯示 CPU 時間的執行總數
-
識別具有高 CPU 時間值的元素。
常見罪犯包括:
- 具有大型集合的迴圈元素。
- 使用複雜篩選條件取得「記錄」元素。
- 具有多個記錄的 DML 作業 (「建立記錄」、「更新記錄」、「刪除記錄」)。
- 具有複雜公式的指派元素。
您現在知道哪些元素耗用最多 CPU 時間。使用此資訊可套用目標最佳化。
如需除錯記錄的詳細資訊,請參閱在開發人員主控台中使用記錄。

