SQL에서 "Agent stack size" 관련 오류는 보통 스택 크기 초과(Stack Overflow) 또는 재귀 호출이 너무 깊어지는 경우 발생합니다.
주요 원인 및 해결 방법
1. 재귀 CTE(Common Table Expression)가 너무 깊을 때
WITH RECURSIVE 쿼리가 너무 많은 반복을 수행하면 발생할 수 있음.
해결 방법: MAXRECURSION 설정 변경 또는 LIMIT 추가.
2. 스토어드 프로시저/트리거의 과도한 재귀 호출
트리거가 서로 호출하는 경우 무한 루프가 발생할 수 있음.
해결 방법: 트리거 로직을 검토하고 재귀 호출을 방지.
3. 데이터 처리량이 너무 많을 때
조인된 테이블이 매우 크거나 너무 많은 데이터가 한 번에 처리될 때 발생 가능.
해결 방법: 인덱스 추가, 배치 처리로 데이터 분할.
---
1. 재귀 CTE 오류 해결 예제
(오류 발생 예제)
WITH RECURSIVE numbers AS (
SELECT 1 AS num
UNION ALL
SELECT num + 1 FROM numbers
)
SELECT * FROM numbers;
무한 재귀 발생 → Agent stack size 초과 오류 발생 가능
(해결 방법)
WITH RECURSIVE numbers AS (
SELECT 1 AS num
UNION ALL
SELECT num + 1 FROM numbers WHERE num < 1000 -- 종료 조건 추가
)
SELECT * FROM numbers;
WHERE num < 1000 → 재귀 호출 제한하여 스택 초과 방지.
---
2. SQL Server에서 MAXRECURSION 사용
WITH RECURSIVE numbers AS (
SELECT 1 AS num
UNION ALL
SELECT num + 1 FROM numbers WHERE num < 10000
)
SELECT * FROM numbers
OPTION (MAXRECURSION 1000); -- 최대 재귀 횟수 제한
---
3. 스택 크기 설정 변경 (DB별 해결 방법)
MySQL:
SET GLOBAL thread_stack = 512000;
PostgreSQL:
postgresql.conf에서 work_mem 값 조정 후 서버 재시작.
work_mem = '64MB'
SQL Server:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory', 4096;
RECONFIGURE;
---
결론
재귀 CTE 사용 시 종료 조건 추가
SQL Server는 MAXRECURSION 설정
DB 설정 변경을 통해 스택 크기 조정 가능
'[DB]SQL실무' 카테고리의 다른 글
[기타]SQLSTATE=22001 오류 (0) | 2025.04.15 |
---|---|
[SQL]WITH 절의 장점 VS 단점 (0) | 2025.03.18 |
[SQL]WITH 절 (1) | 2025.03.18 |
[DB2]가상 테이블(DUAL vs SYSDUMMY1) (0) | 2025.03.18 |
DBMS별 숫자 형변환 함수 예시 (0) | 2025.03.07 |