프로시저 실행계획 차이 문의(MSSQL, 오라클) 0 6 2,413

by 체로키블루 [PL/SQL] 실행계획 프로시저 [2020.06.25 15:17:43]


안녕하세요! :)

MSSQL을 주로 사용하는 개발자입니다.

 

MSSQL의 경우는 최초 프로시저 실행 시 실행계획을 만들어두고 재사용 한다고 알고 있습니다.

예를 들어 프로시저안에서 분기구문이 있다면, 최초 실행시의 분기점을 기준으로 실행계획(프로시저 캐쉬)이 만들어지고

이후 다른 분기의 변수가 들어온다면 적절한 인덱스를 쓸 수 없다고 배웠는데요.

(그래서 분기가 있다면, 분기 구문의 쿼리를 분리하여 새로운 프로시저로 만들면 해결할 수 있다고도 배웠습니다)

 

근데 오라클의 경우는 PL/SQL 내부에서 각종 프로세스를 분기하여 처리하는 것을 보았는데요.

이때는 실행계획이 어떻게 동작하는지 궁금합니다. 고수분들 많은 가르침 부탁 드립니다! :)

 

* 기타: 혹시 제가 MSSQL 프로시저 실행계획에 관해 잘못 알고 있었다면 다시한번 바로 잡아주시길 부탁드립니다.

by 마농 [2020.06.25 16:56:34]

MSSQL은 프로시져에 실행계획이 생기나요?
오라클의 경우엔 각 개별 쿼리에 대해 생기는 걸로 압니다.
프로시져에 생긴다고 하더라도 분기 처리까지 감안하여 실행계획이 수립되지 않을까? 생각됩니다.
추측성 댓글입니다.


by 체로키블루 [2020.06.25 17:07:49]

댓글 감사합니다^^! 

 

1) 제가 교육을 다녔을 때 배웠던 바로는...첫 번째 실행 시점에 실행계획이 생기며, 재컴파일을 하지 않는 한 그 실행계획을 사용한다고 들었습니다. (URL: https://gameserverengineer-k.tistory.com/10)

만약 아니라면 다른분께서 다시한번 설명해 주셨으면 좋겠습니다~^^!

-----------------------------------------------------------------------------------------------------------------------------------

2) 그럼 오라클은 분기문 별로 실행계획이 생겨서..PL/SQL 내부에 분기문을 기입해도 실행할 때는 최적화된 실행계획을 사용할 수 있을까요...?ㅠㅠ


by 마농 [2020.06.26 08:30:12]

참조 URL 예제를 확인해 보니. 분기(IF문)는 없네요?
분기구문이 있다고 하셔서 IF 문 있는 예제 생각하고 답변 드린 건데 그런건 아니네요.
입력되는 조건값에 따라 다르게 타고 싶으신 듯 하네요.
그렇다면 실제로 IF 문을 이용해 분기처리하셔도 되구요.
SELECT 구문을 변경하여 두가지 실행계획을 모두 품도록 할 수도 있습니다.
어떤 조건일때 인덱스를 타고 어떤 조건일 때 풀스캔을 타야 할지가 미리 정해져야 하겠네요.


by 체로키블루 [2020.06.26 10:06:01]

아! 죄송합니다. MSSQL에서 분기문이라고 말씀드린건 IF문을 의미했었습니다..ㅠ

(MSSQL 튜닝 교육받을 때 만능 프로시저를 만들지 말라고 배웠는데..제가 잘 이해를 했는지 모르겠네요^^)

 

제가 궁금했던건 오라클을 사용하는 많은 회사에서 비즈니스 로직을 PL/SQL로 만드는데..

이때는 프로시저 쿼리 실행계획이 어떻게 되는지 궁금했습니다. 말씀하신대로 PL/SQL 내부에서 IF 와 같은 분기문으로 쿼리 종류가 다르게 있더라도, 프로시저 별이 아닌 쿼리별로 실행계획이 생기기 때문에 성능상 문제가 없는거겠죠..?


by 마농 [2020.06.26 10:13:13]

분기된 쿼리별로 실행계획이 수립될 것이니 문제 없을 것입니다.
MSSQL 도 다르지 않을 것 같습니다.


by 한번사는인생 [2020.06.26 17:49:06]

오라클은 모르고, MSSQL에 대한 짧은 의견 내봅니다.

프로시져에도 동적프로시져가 있고 정적 프로시져가 있습니다.

정적프로시져는 캐싱(정확한 명칭은 잘 모르겠네요.)에 저장되어, 한번 실행된 구문에 대해서는 다시 실행하지 않고 캐싱되어져 있는 것을 가져다 쓰는 것으로 알고 있습니다.

그래서 말씀하신 것처럼, IF/ELSE에 있는 것을 다 실행시켜야지 캐싱처리되는 것으로 알고 있습니다.

하지만 동적프로시저는 그러한 캐싱처리가 되지 않기 때문에,

성능상 정적>동적 프로시저로 알고 있습니다. 하지만 어쩔 수 없이 동적 프로시저를 사용해야할 경우가 있으니..

 

저도 웹프로그래머이고, 여기 저기서 주서들은 내용이지만 도움이 될 수도 있다는 생각에 적어봅니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입