오라클은 페이징 시 DB에 쿼리문으로 ROWNUM을 사용한다. 이게 은근 까다롭다.
ROWNUM은 의사 컬럼으로 참조만 될 뿐 데이터베이스에 저장되지 않습니다.
또한 SELECT절에 데이터(row)에 붙는 순번입니다.
그리고 ROWNUM과 ORDER BY를 같이 사용한다면 먼저 ROWNUM이 먼저 부여 되고
그다음으로 ORDER BY가 실행된다.
주로 <, <= 사용하며 >, >= 인 경우 ROWNUM가 실행되지 않습니다.
ROWNUM보다 작거나 큰건 말도 안되는 일
그리고 ORDER BY는 가끔적 사용하지 말자, 어쩔 수 없이 써야 된다면 쓸 수 있지만
속도를 저하 시키기 때문에 좋지는 않다.
지금은 데이터가 많이 없어서 ORDER BY를 쓰든 안쓰든 별 차이가 없지만 데이터가 수만개가 된다면
1초나 2초가 차이가 나버린다.
이럴경우 고객을 비롯해 선임에게 재떨이를 맞을 수 있다.
인덱스(Index)란?
인덱스는 데이터베이스 테이블에 있는 데이터를 빨리 찾기 위한 용도의 데이터베이스 객체이며 일종의 색인기술입니다. 테이블에 index를 생성하게 되면 index Table을 생성해 관리합니다. 인덱스는 테이블에 있는 하나이상의 컬럼으로 만들 수 있습니다. 가장 일반적인 B-tree 인덱스는 인덱스 키(인덱스로 만들 테이블의 컬럼 값)와 이 키에 해당하는 컬럼 값을 가진 테이블의 로우가 저장된 주소 값으로 구성됩니다.
ORDER BY 대신 INDEX를 쓰는 것이 좋다.
SELECT절에 주석같이 생긴게 있다. 저건 힌트라는 것인데
힌트란?
일종의 지시 구문인데, 오라클이 항상 최적의 실행 경로를 만들어 내기는 불가능하기 때문에
직접 최적의 실행경로를 작성해주는 것이다.
- 힌트를 사용하여 아래와 같은 것들을 할 수 있다.
- 액세스 경로, 조인 순서, 병렬 및 직렬 처리, Optimizer의 목표(Goal)를 변경 가능하다.
- 데이터 값을 정렬해야 하는 경우, 힌트의 사용이 필요하다.
- 또한, 드라이빙 테이블을 원하는 대로 선정하고자 할 때도 사용된다.
일단 몇가지만 소개
/*+ FULL(table_name) */
:: Table을 모두 스캔 하길 원할 때 사용합니다.
/*+ INDEX(table_name index_name) */
:: 지정된 index를 강제적으로 쓰게끔 지정
- in list predicat에 대해서도 가능.
- Multi-column inlists는 index를 사용할 수 없다.
:: 참고한 블로그
'Back-End > Spring' 카테고리의 다른 글
[Spring] 컨트롤러 정의 및 설정 (0) | 2021.08.01 |
---|---|
[Spring] Mybatis와 스프링 페이징 처리 (0) | 2021.07.28 |
[Spring] 5. 프로젝트의 구성 (0) | 2021.07.18 |
[Spring] 4. MVC구조 중 Controller (0) | 2021.07.17 |
[Spring] 3. MVC구조 기본 (0) | 2021.07.16 |