order by 인덱스를 타지 않는 원인이 무엇일까요?? 0 4 1,555

by 정수리형 [SQL Query] [2023.05.15 13:48:29]


웹페이지에서 검색 조건이 없이 

전체 조건으로 검색하는 쿼리입니다.

 

SELECT PY_NO, APPLY_TYPE, UNI_NAME, UNI_YEAR, HI_NAME, HI_YEAR, MS_NAME, MS_YEAR, ES_NAME, ES_YEAR, UNI_MAJOR, PY_PHONE, BANK_NAME, BANK_NUM, BANK_OWNER, PY_YN, PY_ETC, ST_PK, ADDER, ADD_DATE, PY_DATE, PY_MONEY, ST_NAME, ST_ADDRESS, PR_ADDRESS, PR_NAME, PY_COUNT FROM ACT_PAYMENT_TB ORDER BY ST_NAME ASC, APPLY_TYPE ASC, PY_COUNT ASC, PY_DATE ASC

 

위의 쿼리를 explain 했을 경우 type all로 스캔을 합니다.

특정 조건이 없기때문에 order by를 index를 태우려고 합니다

구글링을 참고하여

order by 절에 있는 컬럼으로

다중 인덱스 컬럼을 설정한 후 (인덱스 컬럼 순서 ST_NAME, APPLY_TYPE, PY_COUNT, PY_DATE)

ORDER BY ST_NAME, APLLTY_TYPE, PY_COUNT, PY_DATE;

로 변경한 후 EXPLAIN 해보았지만 아무 변화가 없었습니다.

 

1.어떤 부분을 수정하면 order by 절에서 index를 사용할수 있을까요?

2.검색조건이 없이 전체 데이터 검색 시에는 index를 사용할 필요가 없을까요?

 

선배님들의 가르침 부탁드립니다.

 

 

 

 

by 디비디비딥 [2023.05.15 15:39:38]

1. 인덱스를 통해 정렬된 데이터를 가져온 후 한건한건별로 index seek

2. 테이블을 전체 가져와서 order by 컬럼 기준으로 한번에 정렬하는 작업

옵티마이저가 2를 통한 작업량이 더 적다고 판단해서 그런 것 아닐까요

당연한 이야기 이지만 select 절에 있는 컬럼을 인덱스에 포함된 컬럼만 가져온다면 예상하시는 대로 인덱스를 활용한 실행계획을 탈 것 같습니다.


by 정수리형 [2023.05.15 17:27:01]

답변감사합니다

말씀하신대로 인덱스에 포함된 컬러만 select 절에서 실행해보니 정상적으로 index를 타네요

아무래도 인덱스 포함된 컬럼만 select절에서 불러와야하는게 아니라서 이부분은 어쩔수 없나보네요


by 마농 [2023.05.15 16:30:21]

1. 전체 스캔의 경우에는
- 인덱스 스캔이 풀스캔보다 불리합니다.
2. 웹페이지 용도라면?
- 페이징 처리가 필요해 보입니다.
- 페이징 처리를 한다면? 인덱스 스캔이 풀스캔보다 유리합니다.
3. 억지로 인덱스를 태우려면 힌트 등을 이용하는 방법이 있는데.
- 전제조건으로 인덱스 안에 모든 행이 있어야 합니다.
- 예를 들면 4개 항목 다 널인 행은 인덱스에 포함되지 않습니다. (풀스캔과 인덱스 스캔의 결과가 다름)
- 4개 항목 중에 NOT NULL 설정된 항목이 하나라도 있어야 합니다.
- 만약 NOT NULL 설정은 안되어 있지만 업무적 특성으로 널이 없는 항목이 있다면
- 해당 항목에 대한 NOT NULL 조건을 WHERE 절에 추가해 주면 됩니다.


by 정수리형 [2023.05.15 17:28:10]

답변감사합니다.

웹페이지 용도라서 페이징처리가 되어 있습니다.

말씀하신대로 전체 데이터를 읽는 거라면 풀스캔하는게 낫겠네요!!

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