튜닝을 위한 이모저모를 알고 싶어요. 0 3 1,204

by 하늘 [Oracle Tuning] [2011.09.22 17:34:00]



사이트를 개발하며서 오픈 이후 느린 퀴리문장을 수정하고 있습니다.
실행계획을 기반으로 퀴리를 수정하려고 하는데 실행계획을 정확하게 볼줄 몰라서 인지. 나름대로 어렵네요. 여기 저기 실행계획 보는 부분을 참고하고 있지만 막상 제게 당면한 부분과 비교해 보면 적당한 글을 아직 찾아 보지 못했어요.
여기 저기 돌아 다니다 여기에 여러 고수님들께 한수 배우고자 글을 남깁니다.

1. 실행계획을 보면 (토드기준) 빨강색으로 table access full 이라는 부분이 있는데 이건 제가 아는 수준으로는 인덱스를 타지 않고 full scan을 한 것으로 알고 있어요. 그런데 어느때는 이와 같을때에도 속도에 물리를 주지 않고 빠르게 결과를 보여주는데 반면에 다른때에는 주로 뒷 번호쪽으로 그려질때면 속도가 느려 지고 있네요.

2. order by 구문을 쓰면 속도가 느려집니다. 늘 그런것은 아니지만 여러 테이블을 join 해서 결과를 보는데 속도에도 어느정도 무리를 주지 않고 잘 나옵니다. 그런데...여기에 마지막 라인에 order by 하고 정렬을 주면 속도가 상당히 느려지고 실행계획도 뒤죽 박주 섞여 보이네요. 결과가 이와 같으니 제 추측으로는 order by 구문이 있는것이 실행계획에서 선행처리 되는 건가? 싶네요.
일전에 같은 팀원 한명과 얘기중 조인 조건중 각각에 테이블을 정렬 또는 출력데이타를 정리 해서 조인을 거는 것과 우선 조인을 걸고 나서 정렬 또는 출력데이타를 정리하는 것 중 어느것이 빠른가 얘기를 나눈적이 있는데..제 생각은 선 정리 후 조인 이라고 했고 다른 팀원은 선 조인 후 정리라고 했는데..
order by 같은 경우 여러 차례 퀴리를 실행해 보지만 선 정리 후 조인이 빠르네요.
물론 모든 경우에 반영되는 일은 아니겠으나. 어느쪽으로 퀴리를 만들어 가는것이 유리할까 궁금합니다.
그리고 마지막으로 order by 에서 인수를 한개 쓸때와 한개 이상 쓸때 속도 가 현저히 느려질때도 있는데.
튜닝을 위해서 order by절은 언제 쓰는것이 적당할까요..그리고 실행계획을 보며서 퀴리를 고쳐나갈때 어떤부분을  위주로 봐줘야 하나요..
너무 많은 내용을 질문 드립니다.
by 솔밭 [2011.09.23 09:34:02]
1. 옵티마이저 모드에 first_rows, all_rows가 있습니다.
first_rows는 첫번째 row가 빨리 조회되도록 실행계획이 수립되고
all_rows는 전체 row가 빨리 조회되도록 실행계획이 수립되는 것을 말합니다.

백만건을 조회할 때 앞 부분의 10건과 뒷부분의 10건을 조회할 때 어떨까요?
first_rows의 경우 앞 10건(꼭 10건은 아니지만) 조회 최적화 실행계획이 수립되고 all_rows는 전체 백만건 조회 최적화 실행계획이 수립됩니다.

뒷번호쪽을 그려질때면 속도가 느려지는 것은 oracle의 경우 fetch할 때 arraysize를 이해셔야 합니다. DBMS가 client에 데이타를 보낼때 백만건을 전부 디스크에서 읽어서 DB 서버 메모리에 저장한 후 보내느냐? 아니면 디스크에서 데이타를 읽으면서 일정 건수(arraysize)가 채워지면 바로바로 client에 보내느냐?
이런 작동원리가 숨어 있습니다.

2. 조인후 order by : 전체 조인 후 정렬해야 하므로 전체범위처리
그러나 index를 이용하여 order by 없이 정렬된 순서로 조인가능함.
order by 후 조인 : 먼저 정렬해야 하는 집합(테이블)은 전체범위처리
조인은 부분범위 처리 가능

by 마농 [2011.09.23 10:23:38]
1. 스캔방식의 종류와 각각의 장단점을 알아야 합니다.
또한, 조인방식의 종류와 각각의 장단점을 알아야 합니다.
그리고, 스캔방식과 조인방식이 복합적으로 적용되었을때
어떤 스캔이나 조인이 유리할지?를 여러가지 케이스별로 튜닝 사례를 통해 이해하셔야 합니다.
결론적으로 이분법적 흑백논리로 성급한 결론을 내려 하시면 절대 안됩니다.
각각의 다양한 케이스별로 대처법도 다르고 정답도 다릅니다. 정답이 없는 경우도 있구요.
여러 케이스를 습득해 나가면서 경험을 쌓으셔야 합니다.

2. 조인 후정렬과 정렬 후 조인은 쿼리를 직접 보지 않고는 어떤게 좋다 판다할 수 없네요.
이 또한 케이스별로 다른 결과를 낼 수 있습니다. 짤은 글로만으로 결론을 도출 할 수 없습니다.
실질적인 예시자료로 결론을 내야 하면 이 결론은 모든 경우에 해당하는 것이 아니고 해당 예시에만 해당되는 결론임을 알아야 합니다.

조인 후 정렬 은 정렬된 결과가 보장되지만
정렬 후 조인은 정렬된 결과를 보장하지 못합니다.
앞서 말씀드렸던 조인의 종류가 몇가지 있는데.
정률 후 조인할 때 정렬결과가 보장되려면
정렬결과가 먼저 드라이빙이 되어야야 하구요
후속 테이블은 반드시 Nested Loop 조인방식을 해야만 합니다.

by 현 [2011.09.23 10:51:45]
위에 분들이 잘 설명을 해 주셔서 제가 조금만 덧붙이자면요...

table full scan시 속도가 빠른 경우가 있고 느린 경우가 있다고 말씀하셨는데,
엄밀히 말하면 속도가 빠르다는 것은 빠르게 느껴지시는 것입니다.
table full scan시에는 운반단위에 채워지는 시간이 빠르기 때문에 그만큼 우리가 빨리 볼 수 있고요, 대신 데이터를 끝까지 다 읽을 때까지 걸리는 시간은 데이터 량에 좌우합니다.
이것은 부분 범위처리/전체범위 처리로 생각해 볼 수 있습니다.

또한, order by 가 들어가게 되면 부분범위 처리를 하지 못하고 전체 범위 처리를 하게 됩니다.
데이터를 전체적으로 다 읽어 본 후 정렬을 해야 하기 때문에 늦다고 느껴지시는 것입니다.
아뭏튼, 후자는 처리 하려는 데이터의 양에 따라 속도가 좌우 합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입