DB 전문가가 아닌 글이니. 참조만 하세요.
개발자로서 이정도는 알아야 하지 않을까 싶다. 결국은 테이블과 SQL문을 만드는 것만 개발자의 몫은 아닐 것 같다.

오라클 SQL은 실행전에 반드시 파싱을 하도록 되어있다.

Hard Parsing(이하 하드 파싱)은 기본적으로 다음의 스텝을 가진다.
1. SQL문을 shared pool에 로딩한다. 
2. Syntax parsing.
3. Semantic parsing
4. Query Transformation
5. Optimization
6. Create executable

여기서 중요한 것은 soft parsing(소프트 파싱)은 위의 1번 SQL문을 shared pool에 로딩하지 않는 다는 점이다. 
정확히 말하면, SQL 문에 대해서 오라클에서는 해싱값을 가지게 되고 그 값을 share pool에서 찾아오게 된다. 그래서 쿼리에 space나 개행문자등이 오면 SQL문의 해싱값이 달라지니 hard parsing이 되게 된다.

hard parsing은 기본적으로 shared pool에 존재하지 않은 쿼리들이 들어오게 되므로 오라클의 shared pool 관리자에게 부하를 주는 꼴이 되나다. 즉, share-pool에 reloading이 필요하게 된다. 
결국 soft parsing보다 RAM allocation이나 메모리 management등을 하게 되어서 cpu나 latch에 영향을 미치게 된다. 

hard parsing이 많다는 것은 shared_pool_size가 작다거나 정말 많은 다양한 쿼리가 들어온다고 할 것이고, 결국은 오라클 DB에 부하를 주게 된다. 

메모리 모델은 항상 부하를 일으킬 수 있는 부분이 존재하다. 마치 자바의 GC하고도 비슷하게 생각해 볼 필요가 있다.

반면 꼭 soft parsing이 좋다는 것은 아니다. soft parsing도 1번 shared-pool에 해싱값을 이용해서 shared-pool에서 바로 가져오게 될 뿐이지, syntax 체킹부터 실행까지는 hard parsing과 똑같다.
특히 이 soft parsing이 자주 불리게 되어 많이 호출된다면, 역시 cpu에 부하를 주지 않겠는가?

As we know “hard parse” is a costly operation, even a “soft parse” requires library cache latch and CPU overhead, which if aggregated is a significant number.
(http://charie99.egloos.com/588452)

전체 parsing 대비해서 hard parsing , soft parsing 값을 비교할 수 있으며, soft parsing hitratio가 100%에 가까울 수록 그만큼 좋은 것이라 생각된다.

레퍼런스
http://www.dba-oracle.com/t_hard_vs_soft_parse_parsing.htm
http://www.dba-oracle.com/m_parse_to_execute_ratio.htm
http://charie99.egloos.com/588452


내가 닥친 문제는  select 1 from dual 이라는 validation query가 1분에 한번씩 나가는데, 과연 그게 DB에 큰 부하를 주는지에 대해서 고민중이다.. 하루 1440 번 이고, 서버가 1000대라면, 하루 최대 1,440,000 번 soft parsing을 하게 되고, 분당 1000번 쿼리가 서버로 접근하는 부분도 부하를 줄까?
테스트가 필요할 것 같다..

사실 이 쿼리가 db에 overhead를 준다고 생각되는 정보는 구글에도 찾아볼 수 없었다. 차라리 이상한 hard parsing이나 이상한 배치 쿼리를 찾는게 더 낫다고 생각되는데..

다르게 생각해보면 오라클이 꼭 from 쓰라고 하니까 문제가 생기는 거다. 그냥 from 절 없이 select 1 이렇게 해도 validation query가 쓰일 수 있도록 예외처리만 해줘도~ 좋을 것 같은데..쩝~


Posted by '김용환'
,