저장프로시저가 좋다고 지랄하는 놈들한테 넌지시 말한번 꺼낼수 있는 좋은 아티클..^^; 이분한테 참 감사하고 싶다... 그래도, 나도 싫은 DB 에 잘 몰라서다... 우기기는 싫거든....
참조 : http://resisa.tistory.com/55
"저장 프로시저 사용해보셨나요?" 어떤 분이
저에게 이렇게 묻는다면 저는 "아니요. "라고
대답을 할 것입니다. 안타깝게도(?) 프로젝트에서 전
저장 프로시저를 사용해보지 못했습니다. 그래서 전 저장프로시저에 대해서 잘모릅니다. 이번에는 진짜로 제가 받은 질문입니다. 개발시에 Inline쿼리와 저장 프로시저중에 선택을 해야 한다면 어떤 것을 선택할 것이냐는 질문입니다. 개발인력이 많다면 전 Inline쿼리를 사용할 것이라고 대답했습니다. 개발인력이 많다는 것은 제 개인적인 생각이지만 저처럼 저장 프로시저를 사용해보지 못한 사람들도 많을 것이라는
생각때문이였고 저장 프로시저에 대해서 제 자신이 잘 모르기 때문입니다. 그 분이 다시 저에게 이런 말을 했습니다. 저장 프로시저는 컴파일이 된 이후에 다음에 사용할 경우에는 캐쉬된 상태로 사용되기 때문에 당연히 저장 프로시저를
사용해야 된다는 말이였습니다. 그래서 제가 정적SQL인지
동적SQL인지 명칭이 확실하지는 않지만 파라미터를 사용하는 쿼리는(MSSQL은 @문자로 오라클은 :문자로 받을 경우) 컴파일을 한번만 한다고 말했지만 그 분은 아니라고 하셨습니다. 그럼
한 번 확인해볼까요?
=> Inline쿼리나 저장 프로시저가 컴파일되는지의 여부를 알기 위해서 이전에
SQL 튜닝교육을 받았던 문서를 보다가 운영체제에서 제공해주는 XP에서는 관리도구-성능 Vista에서는 관리도구-안정성
및 성능모니터를 사용하였습니다. 성능모니터를 하기 위해서는 카운터를 추가해주어야 합니다. SQL Server:SQL Statstics에서 SQL
Compilations/sec과 SQL Re-Complilations/sec를 추가해주고
배율을 좀 더 확인하기 쉽도록 1에서 10으로 변경해준
후에 위의 구문 3개를 실행해보았습니다. => 파라미터가 없는 SQL이 가장 높게 나타나는 것을 볼
수 있고 파라미터가 있는 SQL과 저장 프로시저를 동일하게 나타납니다. 이후의 1, 2, 3번 어떤 것을 계속 실행하여도 다시 컴파일
되는 것을 볼 수 없습니다. 혹시나 1, 2, 3번을
실행한 순서에 관계가 있나 싶어 서비스에서 SQL를 내렸다 다시 올려 번갈아 가면서 실행해 보았지만
순서만 달라질 뿐 위의 결과와 똑같은 것을 확인할 수 있었습니다. 여기서 Inline쿼리도 저장 프로시저와 마찬가지로 한번만 컴파일 된다는 것을 알 수 있습니다. 저는 2, 3번만 컴파일이 한번 될 줄 알았는데 1번도 컴파일은 한번만 됩니다. 그런데 왜 1번만 컴파일 과정에서 높게 나타날까요? SQL Server Profiler로
알아보도록 하겠습니다. 2. 파라미터 있는 SQL 3. 저장 프로시저 => 차이가 보이시나요? 1번에서는 SP:CacheInsert가 두 번 되는 것을 확인하실
수 있습니다. 그래서 2번이나 3번보다 컴파일시에 더 높게 나타나는 것입니다. 다음은 컴파일 된 이후에 1번을 실행시킨 것을 추적한 화면입니다. =>
SP:CacheHit가 일어나는 것으로 보아 그냥 날리는 Inline의 쿼리의 경우에도 캐쉬가 되는 것을 알 수있습니다. 더군다나 파라미터가 있는 SQL의 경우에는 마치 저장 프로시저처럼 실행이 되는
것도 알 수 있었습니다. 컴파일도 캐쉬도 Inline쿼리가
저장 프로시저보다 사용하기에 나쁜 이유는 되지 않는 것 같습니다.
=> 1번의 경우 월등히 빠르다는 위에서 제가 테스트한 결과와 조금은 다른 내용으로 저에게 질문을 하신
분과 같은 의견입니다. 2번의 경우가 제가 표현을
못했던 가장 중요한 이유입니다. 복잡한 쿼리문을 네트워크로 전송하는 것보다는 저장 프로시저의 이름만
넘기는 것이 당연히 네트워크의 부하를 주지 않을 것입니다. 하지만 이 경우도 일반적인 응용 프로그램이 아닌 웹 프로그램이면서
웹서버와 DB가 같이 돌고 있는 경우라면 그렇게 큰 차이가 있을까요? 3번의 경우에는 응용 프로그램 자체에서 권한 관리를 한다면 굳이 상관없어 보입니다. 4번이 인라인과 저장 프로시저를 어떤 것을 선택해야 하는지의 가장 중요한 지표가 되는 것 같습니다. 쿼리 부분을 프로그램에서 관리할 것인지 DB안에 저장 프로시저로 관리할
것인지의 여부입니다. |
'IT > DB' 카테고리의 다른 글
인덱스 정리 (0) | 2009.09.30 |
---|---|
인덱스가 있지만 인덱스를 안 타는 경우 (0) | 2009.09.30 |
MS-SQL 실행 계획 확인 (0) | 2009.09.30 |
SUBQUERY와 INLINE-VIEW의 차이 (1) | 2009.09.30 |
[MS SQL] ldf 파일 사이즈 줄이기 또는 삭제하기 (0) | 2009.09.28 |