skill/Java.Kotlin

where in 조건 갯수 제한

have a nice day :D 2025. 7. 30. 08:02
반응형

IN 절에 들어가는 값의 개수에는 SQL과 JDBC 드라이버의 제약이 있습니다. 보통 다음과 같은 기준을 따릅니다:


---

* 일반적인 기준

DBMS 종류 IN 절 허용 최대 개수

Oracle 1000개 이하 (초과 시 OR 조건으로 분리 필요)
MySQL / MariaDB 제한 없음 (실제로는 메모리나 패킷 크기에 따라 제한 가능)
PostgreSQL 제한 없음 (단, 성능 문제 발생 가능)
SQL Server 2100개 이하 (파라미터 기준)
H2 (테스트용 DB) 기본 제한 없음



---

*Oracle의 중요한 제한

Oracle은 IN 절에 1000개 초과 항목을 넣으면:

ORA-01795: maximum number of expressions in a list is 1000

라는 에러가 발생합니다.


---

* 해결 방법

1. 1000개씩 잘라서 OR 연결



val condition = BooleanBuilder()
ids.chunked(1000).forEach { chunk ->
    condition.or(qUser.id.`in`(chunk))
}
val result = queryFactory
    .selectFrom(qUser)
    .where(condition)
    .fetch()

2. 임시 테이블에 ID 목록 넣고 JOIN

대량 ID를 미리 임시 테이블이나 CTE (with 문)로 만들어 JOIN하는 방식이 더 안정적입니다.





---

* 요약

Oracle은 반드시 1000개 제한을 주의하세요.

PostgreSQL, MySQL은 이론상 무제한이지만 너무 많으면 성능 문제가 발생할 수 있습니다.

1000개 이상이면 chunking + OR 조건 처리가 가장 일반적인 해결 방법입니다.

--

JPA에서 PostgreSQL기반으로 IN 조건 처리 시, 오류 발생 해서 끊어서 조회한 경험 있음


반응형

'skill > Java.Kotlin' 카테고리의 다른 글

Jacoco 리포트 화면  (0) 2025.09.16
jacoco 개념 + 외부 연동 MockkBean 처리  (0) 2025.09.15
MinIO 403 오류 확인:access/secret key 정상 확인  (3) 2025.07.28
Kotlin UTC  (3) 2025.06.12
Oracle + Kotlin + JPA 연결  (0) 2025.06.12