07 PL/SQL 함수의 특징과 성능 부하

Hi·2026년 7월 2일

(1) PL/SQL 함수의 특징

PL/SQL은 인터프리터 언어이므로 그것으로 작성한 함수 실행 시 매번 SQL 실행 엔진과 PL/SQL 가상머신 사이에 컨텍스트 스위칭이 일어난다.

SQL에서 함수를 호출할 때마다 SQL 실행엔진이 사용하던 레지스터 정보들을 백업했다가 PL/SQL 엔진이 실행을 마치면 다시 복원하는 작업을 반복하게 되므로 느려질 수 밖에 없다.

(2) Recursive Call을 포함하지 않는 함수의 성능 부하

오라클 내장 함수 to_char와 사용자 정의 함수를 사용할 때의 수행시간을 비교해 보면 2.45초, 15.57초 소요된 것을 알 수 있다.

Recursive Call 없이 컨텍스트 스위칭 효과만으로 보통 5~10배 정도 느려진다.

(3) Recursive Call을 포함하는 함수의 성능 부하

보통 사용자 정의 함수에는 Recursive Call이 포함된다.

Recursive Call은 매번 Execute Call과 Fetch Call을 발생시키기 때문에 대량의 데이터를 조회하면서 레코드 단위로 함수를 호출하도록 쿼리 작성시 성능이 극도로 나빠진다.

I/O가 전혀 발생하지 않는 가벼운 쿼리를 삽입했음에도 1분 5초 가량 소요

Recursive Call 없는 함수와 비교하면 4배 가량 더 느려졌다.
=> 원인: 데이터베이스 Call + I/O 발생

함수에서 발생하는 Recursive Call은 대부분 I/O를 수반하므로 실제 훨씬 큰 성능저하를 일으킨다.

(4) 함수를 필터 조건으로 사용할 때 주의 사항

함수 조건이 인덱스 access면 1번, filter면 액세스 레코드 수만큼 호출된다.

-> 이는 인덱스 access, filter 과정 생각하면 됨

(5) 함수의 읽기 일관성

함수 안에 Select 문이 들어 있으면, 그 함수를 대량 행에 걸어 조회하는 도중에 다른 세션이 데이터를 바꾸고 커밋할 경우 같은 입력값인데 결과가 중간부터 달라지는 형상이 생긴다.

원인은 함수 내부 쿼리가 메인 쿼리의 시작 시점이 아니라 자기가 실행되는 시점을 기준으로 블록을 읽기 때문이다!

이런 경우 일반 조인문이나 스칼라 서브쿼리를 사용할 때만 완벽한 문장수준 읽기 일관성이 보장된다.

0개의 댓글