튜닝관련 질문입니다. 도저히 모르겠습니다. 0 1 915

by 물통20병 [Oracle Tuning] 튜닝 선택 방식 [2017.08.12 16:04:07]


튜닝에 대해서 공부를 하고 실제로 적용시켜보는 연습을 하고 있습니다.

튜닝을 적용시키는 도중에 이해가 안되는 부분이 있어 이 부분에 대해 질문하고 싶습니다.

제가 이해하는 튜닝의 목적은 Io Cost를 줄여 자원을 효율적으로 쓰는 것이 라고 알고 있습니다.

그래서 일반적인 경우 Index를 태우는 것이  Io Cost를 적게 잡아먹는 것으로 알고 있습니다.

제가 궁금한 부분은  Index가 사원번호(saweon_no),  일자(ilja)로 구성되어 있는 경우 사원번호는 19000000 부터 21000000 사이에 

군집되어 있습니다. 

saweon_no의 경우 between '19000000' and '21000000' 으로 진행하는 경우 Index를 타고 Io Cost도 줄여주지만  실제 읽어 주는 열의 수는

Full Table Scan과 동일한 경우를 나타납니다.

이런 경우에는 Full Table Scan과 동일한 결과를 같는 경우이기 때문에 Between '19000000' and '21000000' 문법을 제거하는 것이 맞다

고 생각되어 제거하면 Full TableScan을 타게 되어 전체적인 Io Cost는 높여주게 됩니다.

이런 경우에 어떤 선택을 해야 제대로 된 튜닝을 하는 걸까요? 선택을 하기가 힘듭니다.

Index를 타게되는 조건문이 결론적으로 Full Table Scan을 하게되는 경우 Index를 사용하지 않고 Full Table Scan을 하는 건지 어떤식으로

선택을 해야하는 건지 궁금합니다. 

 

by jkson [2017.08.13 08:40:28]

인덱스가 saweon_no, ilja 컬럼으로 구성되어 있고

select saweon_no, ilja from table 이런 형태라면 테이블을 읽을 게 아니라 인덱스만 읽는 게(index full scan) 효율적입니다.

인덱스 크기는 테이블보다 당연히 작을 것이고 인덱스만 읽고 테이블 정보는 읽지 않아도 되니까 IO가 줄겠죠.

select saweon_no, ilja, 다른컬럼들 from table 이런 형태이고 인덱스를 활용하게 된다면

테이블 안의 모든 데이터에 대해 인덱스에서 데이터 1건을 읽고 1건과 연결되어있는 테이블 정보을 1건 읽어야 합니다.

왜냐면 사원번호, 일자 이외의 다른 컬럼 데이터를 읽으려면 테이블로 접근해야만 하니까요.

전체 데이터에 대해 인덱스 읽고 테이블 읽고 이렇게 읽어 들이는 건 아주 비효율 적이고 IO도 늘어나게 됩니다.

이럴 바에야 테이블만 읽어주는 게(table full scan) 훨씬 이득이겠죠.

조건으로 사원번호를 사원번호 전체를 줬을 때 인덱스 스캔만 하는 게 아니고 테이블 스캔까지 하는 플랜이 나왔다면

통계정보 이상으로 굳이 인덱스 스캔을 할 필요 없는 상황에서 잘못된 플랜이 생성된 것 같구요.

전체 데이터 중 아주 일부의 데이터만 읽을 때는 인덱스 스캔이 유리하지만 전체 데이터를 읽을 때는 테이블 풀스캔이 유리합니다.

결론적으로 말씀하신 상황(전체 데이터 읽는..)은 인덱스 스캔이 필요 없는 상황입니다.

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