오라클 Internal Function이란?

haman92·2021년 12월 30일
0
post-thumbnail

번역 및 참고 : https://programmer.help/blogs/5defa81238b5c.html

SQL 튜닝 연습을 위해 실행계획을 분석하다보니

select to_char(m.날짜,'yyyyMMdd'), max(주문금액)
from 주문 j, 월별테이블 m
where to_char(j.주문일자,'yyyyMMdd') = to_char(m.날짜,'yyyyMMdd')
group by to_char(m.날짜,'yyyyMMdd')
order by to_char(m.날짜,'yyyyMMdd');

PREDICATE INFROMATION 부분에 INTERNAL_FUNCTION() 이라는 함수가 보였고 궁금하게 되었기에 찾아보고 설명하는 페이지를 작성한다.

INTERNAL FUNCTION 이란 무엇인가?

인터넷을 찾아 본 결과INTERNAL FUNCTION은 주로 오라클 내부에서 암시적 변환에서 발생한다고 한다. 그리고 실제로 내가 작성한 SQL에서도 암시적 변환을 위해서 발생한 느낌이 드는곳에서 INTERNAL FUNCTION이 보인다.
참고한 블로그 저자에 따르면 암시적 변환에 따라서만 나오는 것은 아니라고 한다.
INTERNAL FUNCTION에 대한 특수 기능은 암시적 데이터 형변환을 수행하는 데에 작용한다고 오라클 공식문서에 기술되어있다고 한다.
(*현재는 PAGE NOT FOUND가 뜬다.)
https://docs.ORACLE.com/cd/e11882-u01/server.112/e25523/part-uavail.htm-sthref141
실제로 확인해보면 ORACLE 내부에서는 INTERNAL 이라는 함수를 찾을 수 없다고 합니다. 그리고 V$sqlfn "metadata.conf"를 통해서는 internal이라는 객체를 전혀 찾을 수 없다고 합니다.

기능 1. 암시적 데이터 형 변환!

SQL> CREATE TABLE t(a VARCHAR2(20), b DATE);

Table created.

SQL> INSERT INTO t VALUES( TO_CHAR(sysdate), sysdate) ;

1 row created.

SQL> commit;

Commit complete.

실행 계획을 통해 두 개의 서로 다른 데이터 유형을 비교할 수 있도록 오라클이 필드 A에서 암시적 데이터 형 변환을 강제 실행한다는 것을 알 수 있다.

오라클 내에서 WHERE a=b에서 WHERE TO_DATE(a) = B로 암시적 형 변환되기도 합니다. 이는 또한 INTERNAL_FUNCTION이 실행 계획에 나타나는 이유이기도 합니다 - 실제 "바이너리" 실행 계획에서 읽을 수 있는 실행을 생성하는 코드 플랜은 내부 연산 코드를 사람들이 이해하기 쉬운 해당 기능 이름으로 변환할 수 없으므로 기본적으로 디스플레이 대신 "내부" 문자열을 사용하는 것입니다.

기능 2. 파싱하기 힘든 복잡한 표현식


위의 SQL구문에서는 WHERE절의 owner = 'SYS' OR owner = 'SYSTEM'부분이 PREDICATE부문에서 INTERNAL FUNCTION 나타나게 하지 않습니다.


그러나 owner = 'SYS' OR owner = 'SYSTEM' OR
object_id = 123 로 WHERE절을 바꾸어보니 INTERNAL FUNTION이 나타났습니다. OWNER에 관한 부분이 INTERNAL FUNCTION으로 대체되었습니다.

IN으로 바꾸었을때도 OWNER에 관한 부분이 INTERNAL_FUNCTION으로 대체되었습니다.
(* 이 부분은 아마도 IN이 or expansion 때문에 or로 바뀌고 바뀐 sql문이 or을 internal function으로 바꾸지 않았을까 라는 추측)

DBMS XPLAN CURSOR가 단일 실행 계획 단계에 적용된 "복잡한" 복합 predicate를 설명할 수 없습니다. 여기에는 여러 개의 서로 다른 열이 포함되고 그 중 적어도 하나에 확인할 여러 값이 있습니다(예: 목록 또는 ed 술어).

(*이 뒤의 내용은 지식이 조금 딸려서 번역하기 힘든데 DBMS XPLAN에서 실행계획을 분석할때도 INTERNAL FUNCTION이 나온다는 이야기가 몇단락 정도 나온다. 그리고 실행계획에 관한 불만이 한단락정도 나오니 참고 블로그에 가서 확인하는게 좋다.)

INTERNAL FUNCTION 안보이게 하는 법

EXPLAIN PLAN FOR 구문은 일부이지만 복잡한 PREDICATE를 해석할 수 있다.EXPLAIN PLAN이 특정 SQL 문을 특별하고 보다 도구화된 방식으로 구문 분석할 때 분명히 더 많은 정보를 보유하고 있습니다(또한 더 많은 메모리를 사용합니다). 아니면 누가 V $SQL을 작성했습니까? 다음과 같이 더 복잡한 술어를 구문 분석하기 위해 코드를 작성하고 작성하지 않았습니다.

INTERNAL FUNCTION은 보이지 않았고 모든 PREDICATE가 정확하게 보입니다. 그렇기에 정확한 실행계획을 확인하기 위해서는 EXPLAIN PLAN FOR을 활용하는 것이 좋다고 생각합니다.
(* 아쉽지만 나의 경우에는 INTERNAL FUNCTION이 그대로 존재하였다.)

요약
INTERNAL FUNCTION은 암시적 형변환 및 복잡한 PREDICATE를 대신하는데 쓰인다.

0개의 댓글