특정 테이블의 통계정보가 생성되지 않거나 올바른 통계정보가 수집되지 않았을 경우 SQL 실행계획에 문제가 생길 수 있다. 이 경우 보통은 dbms_stat.gather_table_stat 패키지를 사용하여 통계정보를 실행하여 문제를 해결할 수 있다.


그러나 통계정보를 실행하더라도 실행계획이 바로 반영되지 않아서 SQL 의 실행계획 문제를 여전히 해결하지 못하는 상황이 발생할 수 있다.
오라클 10g 부터는 새롭게 통계정보가 생성되더라도 바로 해당 실행계획에 이를 적용하지 않고 적당한 시점을 찾아서 해당 테이블에 연관된 실행 계획 변경을 적용하기 때문이다. . 

물론 ALTER SYSTEM FLUSH SHARED POOL 명령어를 사용하여 모든 SQL 및 실행계획을 Shared Memory 에서 FLUSH OUT 시켜도 된다. 그러나 이 명령은 업무 시간에 동시접속 프로그램이 수행중인 운영 DB에 적용했다가는 문제를 일으킬 소지가 크기 때문에 함부로 적용할 수는 없다. ( 부하가 없는 경우라면 ok ) 

10g 부터 dbms_stat 패키지에 no_invalidate option이 추가되었는데 이를 잘 활용하면 해당 테이블을 사용하는 SQL 만 새로운 실행계획을 생성할 수 있게 해준다. no_invalidate 가 false 이면 실행계획 변경이 바로 적용되도록 함. 

dbms_stats.gather_table_stat 을 수행하기 이전에 dbms_stat.set_param ( no_invalidate false) 와 같이 수행하거나

또는 exec dbms_stats.gather_table_stat( ...... , no_invalidate => false) 로 호출하면 해당 테이블에 관련된 실행계획이 통계정보 update와 동시에 변경 반영됨. 

+ Recent posts