안녕하세요! :)
MSSQL을 주로 사용하는 개발자입니다.
MSSQL의 경우는 최초 프로시저 실행 시 실행계획을 만들어두고 재사용 한다고 알고 있습니다.
예를 들어 프로시저안에서 분기구문이 있다면, 최초 실행시의 분기점을 기준으로 실행계획(프로시저 캐쉬)이 만들어지고
이후 다른 분기의 변수가 들어온다면 적절한 인덱스를 쓸 수 없다고 배웠는데요.
(그래서 분기가 있다면, 분기 구문의 쿼리를 분리하여 새로운 프로시저로 만들면 해결할 수 있다고도 배웠습니다)
근데 오라클의 경우는 PL/SQL 내부에서 각종 프로세스를 분기하여 처리하는 것을 보았는데요.
이때는 실행계획이 어떻게 동작하는지 궁금합니다. 고수분들 많은 가르침 부탁 드립니다! :)
* 기타: 혹시 제가 MSSQL 프로시저 실행계획에 관해 잘못 알고 있었다면 다시한번 바로 잡아주시길 부탁드립니다.
댓글 감사합니다^^!
1) 제가 교육을 다녔을 때 배웠던 바로는...첫 번째 실행 시점에 실행계획이 생기며, 재컴파일을 하지 않는 한 그 실행계획을 사용한다고 들었습니다. (URL: https://gameserverengineer-k.tistory.com/10)
만약 아니라면 다른분께서 다시한번 설명해 주셨으면 좋겠습니다~^^!
-----------------------------------------------------------------------------------------------------------------------------------
2) 그럼 오라클은 분기문 별로 실행계획이 생겨서..PL/SQL 내부에 분기문을 기입해도 실행할 때는 최적화된 실행계획을 사용할 수 있을까요...?ㅠㅠ
오라클은 모르고, MSSQL에 대한 짧은 의견 내봅니다.
프로시져에도 동적프로시져가 있고 정적 프로시져가 있습니다.
정적프로시져는 캐싱(정확한 명칭은 잘 모르겠네요.)에 저장되어, 한번 실행된 구문에 대해서는 다시 실행하지 않고 캐싱되어져 있는 것을 가져다 쓰는 것으로 알고 있습니다.
그래서 말씀하신 것처럼, IF/ELSE에 있는 것을 다 실행시켜야지 캐싱처리되는 것으로 알고 있습니다.
하지만 동적프로시저는 그러한 캐싱처리가 되지 않기 때문에,
성능상 정적>동적 프로시저로 알고 있습니다. 하지만 어쩔 수 없이 동적 프로시저를 사용해야할 경우가 있으니..
저도 웹프로그래머이고, 여기 저기서 주서들은 내용이지만 도움이 될 수도 있다는 생각에 적어봅니다.