SQL문을 실행할 때 마다 새로운 실행계획이 생성되고, 생성된 실행 계획에 대한 SQL문장은 shared_pool이라는 공간에 저장된다.

이와 같이 사원 번호에 관한 SQL문장에 대해 v$sql뷰를 통해 조호회하여 확인할 수 있다.
각각의 문장에 따라 서로다른 실행계획이 실행되며 sql_id의 값을 통해 실제 실행계획을 자세하게 조회할 수 있다.


위 두 실행계획을 비교해보면 실행계획 sql_id와 검색하는 id값만 다를 뿐, 내부적인 실행계획은 완전히 같은 것을 알 수 있다.
수많은 sql문이 실행되고 각각의 실행이 생성되면 share_pool의 메모리 공간은 점점 줄어들게 된다. 많약 shared_pool메모리가 가득차게 되면 서버가 먹통이되고 아래 명령어를 통해 shared_pool 메모리를 초기화 할 수 있다.
ALTER SYSTEM FLUSH SHARED_POOL;
다만 위 코드를 실행하면 모든 실행계획이 삭제되어 다시 새로이 실행계획을 생성해야 하는데, 이 경우 많은 IO가 발생하여 느려질 수 있다.
위와 같은 문제가 발생하는 이유는 각각의 SQL문 마다 같은 실행계획을 가지고 있더라도 이를 공유하지 못하기 때문이다.
즉 사용된 실행계획을 공유할 수 있으면 이를 극복할 수 있다.
우리는 이것을 PL/SQL의 변수를 이용해 극복하고자 한다.
기존의 SQL과 달리 PL/SQL은 기존 SQL에 PL(PROCEDURE LANGUAGE)개념을 추가한 언어이다.
즉
SQL을 확장한 절차적 언어
라고 정리할 수 있다.
우리는 PL/SQL을 이용해 SQL의 실행 계획에서의 한계를 극복할 수 있다.