웹페이지에서 검색 조건이 없이
전체 조건으로 검색하는 쿼리입니다.
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를 사용할 필요가 없을까요?
선배님들의 가르침 부탁드립니다.
1. 인덱스를 통해 정렬된 데이터를 가져온 후 한건한건별로 index seek
2. 테이블을 전체 가져와서 order by 컬럼 기준으로 한번에 정렬하는 작업
옵티마이저가 2를 통한 작업량이 더 적다고 판단해서 그런 것 아닐까요
당연한 이야기 이지만 select 절에 있는 컬럼을 인덱스에 포함된 컬럼만 가져온다면 예상하시는 대로 인덱스를 활용한 실행계획을 탈 것 같습니다.
답변감사합니다
말씀하신대로 인덱스에 포함된 컬러만 select 절에서 실행해보니 정상적으로 index를 타네요
아무래도 인덱스 포함된 컬럼만 select절에서 불러와야하는게 아니라서 이부분은 어쩔수 없나보네요
1. 전체 스캔의 경우에는
- 인덱스 스캔이 풀스캔보다 불리합니다.
2. 웹페이지 용도라면?
- 페이징 처리가 필요해 보입니다.
- 페이징 처리를 한다면? 인덱스 스캔이 풀스캔보다 유리합니다.
3. 억지로 인덱스를 태우려면 힌트 등을 이용하는 방법이 있는데.
- 전제조건으로 인덱스 안에 모든 행이 있어야 합니다.
- 예를 들면 4개 항목 다 널인 행은 인덱스에 포함되지 않습니다. (풀스캔과 인덱스 스캔의 결과가 다름)
- 4개 항목 중에 NOT NULL 설정된 항목이 하나라도 있어야 합니다.
- 만약 NOT NULL 설정은 안되어 있지만 업무적 특성으로 널이 없는 항목이 있다면
- 해당 항목에 대한 NOT NULL 조건을 WHERE 절에 추가해 주면 됩니다.
답변감사합니다.
웹페이지 용도라서 페이징처리가 되어 있습니다.
말씀하신대로 전체 데이터를 읽는 거라면 풀스캔하는게 낫겠네요!!