With AA As ( Select '001' CODE, '홍길동' NAME From Dual Union All Select '004' CODE, '김길동' NAME From Dual Union All Select '002' CODE, '홍석동' NAME From Dual Union All Select '005' CODE, '이순신' NAME From Dual Union All Select '003' CODE, '구마동' NAME From Dual Union All Select '006' CODE, '신길동' NAME From Dual Union All Select '007' CODE, '박길동' NAME From Dual ) Select * From ( Select row_number() over (order by NAME) as RowNo, AA.* From AA Where 1 = 1 And NAME Like '%동' --And CODE > :LASTCODE --Order By가 Name이다보니 선 필터링을 못함.. ) Where Rowno >= ((:PAGENO - 1) * :ROWCNT + 1) And RowNo <= (:PAGENO * :ROWCNT); --ROWCNT = 2, PAGENO = 1
1억건 이상의 데이타 인데요..다음과 같이 이름으로 조회시 Code가 Unique인데 보여줄때는 이름순으로 보여줘야 해서 중간에 Code로 필터링을 못하고 있습니다.
뭔가 좋은 방법이 없을련지요??
정확한 정렬 및 페이징을 위해서는
order by 기준에 중복되는 name 외에 유니크한 code 또는 Rowid 등이 추가되어야 합니다.
중복값으로 정렬시 페이징이 이상해 질 수 있습니다.
성능향상을 위해서는
name 인덱스가 필요해 보입니다.
aa.* 로 테이블의 모든 항목을 가져오기 보다는
인덱스 항목인 name 과 ROWID 만을 가져와 페이징하는게 좋습니다.
기타 필요 항목은 페이징 완료후에 테이블 조인하여 가져오면 됩니다.
다음 페이지 가져오기 방법을 이용하기 위해서는
last_code 가 아닌 last_name 과 last_rowid 항목을 이용해야 합니다.
AND ( (name = :last_name AND ROWID > :last_rowid) OR (name > :last_name) )
다음 강좌 참고하세요.
http://www.gurubee.net/expert/kwontra
6. 목록 쿼리를 최적화하자.