프로시저에서 실행시 결과값이 무진장 느려졌어요~ 0 2 2,256

by 처리~ [PL/SQL] [2017.12.12 09:18:26]


쿼리문만 돌리면 쌩쌩 잘돌아 가는데요 이것을 프로시저에 넣고 실행하면 결과값이 심하게 느리게 나옵니다.

인덱스가 깨진거면 쿼리문자체도 느릴듯한데...이건 아닌듯 하고요~

프로시저를 새로 만들어도 마찬가지네요.

어떤부분을 확인해야 할지몰라...질문드립니다.

답변 부탁 드리겠습니다~

by jude oh [2017.12.12 11:39:12]

SQL SERVER예기 같은데요..

쿼리문만 돌리면 잘 돌아 간다는 예기는..적어도, 적절한(적당한) 인덱스는 있다는 예기로 들립니다.

이를 프로시져에 반영해서 웹에서 실행하면 느린것은(프로시저에 넣고 실행하면...이라는 말이 그렇게 해석되서...)

로컬PC에서의 실행계획과 웹에서의 실행계획이 다르기 때문입니다.

이런 요인은 여러가지 경우의 수가 있을 수 있습니다.

로컬TOOL의 옵션과 ODBC/JDBC/ADO등의 옵션의 차이 일 수도 있고,

통계정보가 오래되서 일수도 있고,

쿼리가 넘 복잡해서 옵티마이져가 미쳐버렸거나 ㅡㅡ;;) 일 수도 있습니다.

 

어째뜬 해결방법으로는

실제 웹서버에서 실행되었을때의 실행계획을 확인해보는게 가장 좋을 것 같습니다.(이것도 참 정확하지 않을때가 있습니다.)

개발자분이 의도했던(예상했던) 실행계획과는 다르게 풀렸을 가능성이 높습니다.

(네스티드 루프를 예상했으나 해쉬나 머지가 걸렸거나..등등)

 

어렵다고 한다면 쿼리에 힌트를 직접 줘 보는 방법이 있습니다.

- 특정 인덱스를 타도록 WITH(INDXE= 해보고,그래도 문제가 있다면 JOIN방식을 강제해도 보고,그래도 안되면 FORCE ORDER 같은 옵션도 줘볼만 합니다.

- 그외에도 RECOMPILE 옵션을 줘보거나 OPTIMIZER FOR 옵션을 줘보거나 

여러가지 시도해볼만한 것은 많습니다.

 

최대한 힌트를 주지 않고 쿼리를 만드는게 좋을 것이나,상황에 따라서는 개발자가 개입을 해야할 경우도 있다고 봅니다.제 경험상 그렇습니다.

인덱스 리오나  리빌드,통계정보 업데이트 등도 주기적으로 해 주는게 좋을것 같습니다.

 

 

 


by 처리~ [2017.12.12 16:24:20]

답변감사합니다~

DB 는 오라클 입니다~~~

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