문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
database:seek_method [2022/03/22 16:57] kwon37xi 만듦 |
database:seek_method [2023/05/31 13:27] (현재) kwon37xi [seek method] |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== seek method ====== | ====== seek method ====== | ||
+ | * 명칭이 명확하지 않음. | ||
+ | * seek method, keyset pagination 등으로 불리는 듯. | ||
+ | * [[java: | ||
+ | * https:// | ||
+ | |||
+ | ===== offset/ | ||
+ | * '' | ||
+ | * 또한, 페이지를 이동하는 사이에 '' | ||
+ | * 데이터 추가시 : 그 뒷 페이지에서 앞선 조회에서 나왔던 데이터가 새로 추가된 데이터로 인해 뒤로 밀리면서 뒷편 페이징에서 다시 출현하게됨. | ||
+ | * 데이터 삭제시 : 이번 페이지에서 맨 앞부분에 조회되었어야할 데이터가 앞 선 페이지에서의 데이터 삭제로 바로 앞 페이지 쪽으로 이동하면서 조회가 안되고 누락되는 현상 발생. | ||
+ | * 거기에다 '' | ||
+ | ===== seek method ===== | ||
+ | * 이를 해결하려면 PK id 값으로 정렬을 하고(보통은 '' | ||
+ | * 처음에는 PK값 제약없이 조회, 조회 결과 limit 이 10이면 마지막 PK값 기억 | ||
+ | * 그 다음부터는 **asc 일 때** '' | ||
+ | * 물론 **desc 일 때**는 '' | ||
+ | * 이 방식을 '' | ||
+ | * 조회 일관성을 위해 일정한 '' | ||
+ | |||
+ | |||
+ | ===== 주의 ===== | ||
+ | * 최초 시작 쿼리의 경우에도 '' | ||
+ | * 모든 seek method 쿼리에는 '' | ||
+ | * 이렇게 해야 불필요한 전체 정렬('' | ||
+ | |||
+ | ===== 최종 형태 ===== | ||
+ | * '' | ||
+ | <code sql> | ||
+ | select min(PK) from table; -- 값 저장: pkmin | ||
+ | select max(PK) from table; -- 값 저장 : pkmax | ||
+ | -- 조회 시작시 | ||
+ | select * | ||
+ | from table | ||
+ | where | ||
+ | pk >= [pkmin] | ||
+ | and pk <= [pkmax] | ||
+ | [기타조건] | ||
+ | order by pk asc | ||
+ | limit [pageSize] | ||
+ | |||
+ | -- 그 뒤부터는 | ||
+ | select * | ||
+ | from table | ||
+ | where | ||
+ | pk > [앞선 조회의 마지막 PK값] | ||
+ | and pk <= [pkmax] | ||
+ | [기타조건] | ||
+ | order by pk asc | ||
+ | limit [pageSize] | ||
+ | </ | ||
===== 참조 ===== | ===== 참조 ===== | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
* [[https:// | * [[https:// | ||
- | * | + | * [[https:// |
+ | * [[https:// | ||