미리 쿼리를 테스트하면서 짯기 떄문에 1초 이하로 떨어지는 걸 확인하고
같은 내용을 저장프로시저로 만들어서 돌리면 17초씩 걸리네요.
보통 이럴때 어느 부분을 체크하면 될지요?
우워~!!! 진짜 이런 경우는 첨이네요.
Comment 2
-
무념
2014.08.12 19:47
-
처리짱
2014.08.13 12:30
어줍짢은 답변 달아 봅니다..
프로시져 생성 후 최초 실행시 5단계를 거칩니다.
구문분석, x, x, x , 실행. 죄송 중간은 기억이 가물.. ;;
저 단계중에 3개의 x가운데 실행계획을 만드는 단계가 있는데
최초 실행에서 만들어진 실행계획을 가지고 두번째 부터는 따라가죠..
최초 실행시에 매개변수로 들어온 값이 인덱스를 타게 되어 실행계획을 생성하였는데.
두번째 실행시 매개변수로 들어온 값이 생성된 실행계획을 가지면서 인덱스를 제대로 활용하지 못했나 싶네요..
프로시져안에 옵션을 줘서 실행계획 계속 다시 만들게 할수도 있고요..
그냥 쿼리로 날리면 실행계획을 계속 생성하면서 부하가 갈수 있는데
쿼리를 날리지 않고 프로시져를 써야하는 이유가 여기 있다고 해야할까요 ㅎㅎㅎ
보통 파라미터 스니핑이라고 부르더군요..
자답.
전임자분이 예를 들면...
같은 조건의 합계 여러가지를
insert into abcd(a,b,c,d,f)
(
@a,
(select sum(a) from aaa where 어쩌구 저쩌구......),
(select sum(b) from aaa where 어쩌구 저쩌구.....),
(select sum(c) from aaa where 어쩌구 저쩌구.....)
...
이런식으로 아름답게 쿼리를 해놨네요.
고쳐야 될 양이 많다보니.. 무심코 지나갔는데 쿼리에서 테스트할땐 빠른데요..
저장프로시저 안에 들어가 있는 상황서 호출하니 1초도 안걸리는 작업이 17초씩 걸리더군요 ㅡㅡ;
저 구분을 다 빼버리고 돌리니 1초도 안걸리네여 에거.. 이런 경험은 첨이고..
설마 저렇게 무섭게 쿼리를 헀을줄은.... 이런 경우도 있다고 자답을 쓰네요.