본문 바로가기

IT관련

오라클 Undocumented Hint (materialize, inline 힌트) - With 구문

Oracle With 구문에서 가끔 /*+ materialize */ 라는 힌트를 사용한 SQL을 볼 때가 있습니다.

이건 과거 10g 이하 버전에서 With 절이 반복적으로 호출될 때, 이걸 매번 실행하지 않고 한번만 실행하도록 Global Temporary Table 을 만들어버리도록 명령하는 힌트입니다.

 

즉, 아래와 같은 SQL 문에서 With 절로 만들어진 dept_count 부분이 메인 SQL문에서 2번 호출되었습니다.

 

 

호출될 때마다 With 구문의 SQL을 실행할 겁니다. 하지만, 처음 한번 실행후 실행결과를 임시테이블로 만들어버리면 2번째 호출되는 것은 그냥 임시테이블에서 결과를 가져오기만 하면 되기 때문에 실행이 빨라질 겁니다.

 

이런 아이디어에서 /*+ materialize */ 힌트가 나오게 되었습니다.

 

 

/*+ materialize */ 힌트를 With 절에 사용함으로써, Plan 을 보면 Temp Table (SYS_TEMP_...) 이 만들어지는 것을 확인할 수 있습니다.

 

반대로, 굳이 Temp Table 을 만들지 말라고 명령하는 힌트가 /*+ inline */ 입니다.

 

 

With 절의 Select 구문이 실행시 오버헤드가 많이 걸리는 경우라면, /*+ materialize */ 힌트가 유리할 겁니다.

 

과거에는 Default 동작이 inline 이었기 때문에 명시적으로 materialize 힌트를 주는 경우가 많았는데, 10g 이후로는 굳이 이런 힌트를 주지 않아도 Oracle 이 알아서 Temp Table 로 처리해 버립니다.

 

따라서, 이제는 더이상 /*+ materialize */ 힌트를 사용할 필요가 없습니다.

 

 

Oracle 19c 에서 실행한 건데, With 절에 /*+ materialize */ 힌트가 없지만, Global Temporary Table 을 만들어서 처리하고 있습니다.

 

과거에 materialize, inline 힌트가 나왔을때, 이게 Undocumented Hint 로 나왔습니다.

즉, 힌트를 쓰면 동작은 하는데, 오라클이 공식적으로 발표하지 않은 기능이었죠. 그래서 그런지 관련 버그도 좀 있었습니다.

지금은 이 힌트를 안써도 알아서 동작하기 때문에 굳이 쓸 필요가 없습니다.