by 김종석 [Oracle 기초] [2017.06.28 08:42:54]
토드에서 플랜떠도 문제없고 속도도 잘나오는데 서버에서 실제 실행속도가 많이 느립니다.
토드 :0.5초 , 실제 서버 실행시간 : 10분 ..
테이블 하나를 풀스캔 타는걸로 보이고 연산자를 바꾸거나 힌트를 주면 다시 빨라 지기는 하는데 원인이 뭔지 모르겠습니다.
감사합니다.
토드에서는 500라인 먼저 보이게 세팅이 되어있죠. 그래서 plan이 first_rows로 풀리게 될 가능성이 높습니다.
웬만하면 nested loop로 풀리려고 할 거구요.
실제 프로그램에서는 부분범위처리 해놓지 않는 이상 all_rows로 풀릴 가능성이 있겠죠.
토드에서는 500라인 우선 가져오게 nested loop로 프로그램에서는 조회하는 데이터량이 많아서
fullscan으로 풀린 것 같네요.
바인드변수를 사용하는 쿼리인데 토드에서는 상수조건으로 테스트 한건 아닌지요?
바인드변수 이야기하신 거 보니
예전에 이런 경우가 있었어요.
토드에서 쿼리 만들 때는 문자형으로 바인드변수값 넣어줬는데
프로그램에서 돌릴 때 숫자형으로 줬던가.. 여튼 강제로 형변환이 일어나면서 인덱스를 사용 못 하게되는..
그런 경우가 아닌지도 테스트 해보시면 좋을 것 같네요.
바인드 변수는 사용 합니다만 문자형이 맞는데요. 그문제는 아니라고 보는게.. 써놨듯이 힌트를 주거나 연산자를 바꾸면 잘 나와서요.
서버에서 바인드 변수 사용했듯이 토드에서도 바인드 변수 사용한게 확실한가요? 바인드 변수 사용을 상수값으로 바꾸어 테스트 하고, 똑같이 테스트 했다고 생각하는데 절대 똑같지 않습니다.
결과는 한건정도 나오는 쿼이고 .. 부분 범위처리 문제는 아닌거 같습니다.
한 건 정도 나오는 쿼리면.. 부분범위 처리 문제는 아닐 것 같네요.
토드에서 접속한 서버랑 말씀하신 서버라는 것이 동일한 서버 맞죠?
말씀하신 서버라는 것은 운영 프로그램상에서 느리다는 것인가요?
마농님 말씀대로 바인드 변수로 바꾸고 하니까 토드에서도 느리네요 . 결과가 있을때와 없을때가 또 다르네요. 감사합니다 .여러부들.
같지않다는건 원래 알았는데, 보통 토드에서 테스트할때는 스트링으로 바꾸고 하다보니 . 특히 마농님 감사합니다.
귀신같이 잡아내시네요ㅎㅎ
바인드피킹시에 fullscan으로 실행계획 잡혔나보네요?
그런데 바인드변수로 쿼리 실행했을 때 결과가 있을 때와 없을 때가 다르다는 게 잘 이해가 안 되는데
바인드변수로 처리할 때 실행계획이 fullscan이면 어떤 값이 들어가든 동일해야 하는 것 아닌가요?
약간 이해가 안 되네요.
사용하신 쿼리를 보여주시면 비효율 제거해 드립니다.
ㅋㅋㅋ 마농님 무슨 업자 같은ㅋㅋㅋ