플로에서 Apex_CPU_TIME_LIMIT_EXCEEDED 오류 문제 해결
트랜잭션이 너무 많은 CPU 시간을 소비하면 Salesforce에서 Apex_CPU_TIME_LIMIT_EXCEEDED 오류를 발생시킵니다. 플로는 Apex 트리거를 포함하여 동일한 트랜잭션의 모든 다른 자동화와 이 제한을 공유합니다.
필수 Edition
| 지원되는 Edition 보기. |
| 필요한 사용자 권한 | |
|---|---|
| Einstein 및 Agentforce for Flow를 포함하여 Flow Builder에서 사용할 수 있는 모든 플로 유형, 요소 및 기능을 사용하여 플로를 열고, 편집하고, 만들고, 활성화하거나 비활성화하려면 다음을 수행합니다. | 플로 관리 |
| 설정 및 디버그 로그 보기: | 설정 및 구성 보기 |
| 디버그 로그 보기, 유지 및 삭제, 추적 플래그 설정: | 모든 데이터 보기 |
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 연산자, 첫 번째 레코드 가져오기 컬렉션을 사용하여 보조 레코드를 필터링합니다. 예를 들어, 계정 ID > 계정 > 계정 가져오기에서 계정입니다. 예: 먼저 계정 ID별로 필터링하는 레코드 가져오기 요소를 사용하여 모든 관련 연락처를 가져온 다음 루프 도중 연락처 컬렉션을 참조합니다. |
루프 내에서 쿼리를 피하십시오. 루프에 들어가기 전에 필요한 데이터를 모두 가져옵니다. |
루프의 복잡한 수식 각 루프 반복에서 복잡한 수식 계산을 실행하는 할당 요소는 특히 문자열 조작, 날짜 계산 또는 중첩된 함수와 함께 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 시간을 소비하는 요소를 파악할 수 있습니다. 이 정보를 사용하여 대상 최적화를 적용합니다.
디버그 로그에 대한 자세한 내용은 Developer Console에서 로그 사용을 참조하십시오.

