6월 30일 화요일
페이징에 대해 찾아보던 도중 페이징을 소스에서 할 때, DB에서 할 때 각각의 장 단점을 알아보라고 하셨습니다.
장단점을 생각하던 중 소스에서의 '페이징'은 DB에서 일정 범위 별로 나누어 SELECT 한 데이터를 유저에게 보여지는 페이징 넘버를 출력.
DB에서의 '페이징' 은 데이터를 일정범위 별로 나누어 SELECT 하는 것을 의미한다는 것을 깨닫고
이에 따라 소스와 DB를 장단점으로 구분하기보단 DB 페이징 쿼리를 직접 만들어 보았습니다.
우선 DB에서 페이징 쿼리를 작성할 때 사용하는 쿼리를 MS SQL 기준으로 찾아보았습니다:
Primary Key 의 auto increment identity 옵션을 이용하여 ID 를 선언 후
SELECT TOP n // 상위 n개의 쿼리를 조회
간단히 5 column 페이징을 구현한다면
SELECT TOP 5 * FROM USERS WHERE ID NOT IN (SELECT TOP 0 ID FROM USERS)
하지만 이 방법은 not in 판별을 위해 전 게시물들을 모두 조회해보아야 된다는 단점과
중간에 identity 값이 빠져있을 경우가 있어 많고 유동적인 데이터를 출력할 땐 좋지 않다고 판단되었습니다.
이 단점을 해결하기 위해서 column 로딩을 최대한 줄이고 기존 identity가 아닌 새로운 Index가 필요했으므로,
SELECT TOP 이 아닌 BETWEEN 쿼리와 ROW_NUMBER() 를 사용하여 1번에서 5번까지의 column을 뽑는 쿼리로 보완 하였습니다.
SELECT * FROM( SELECT ROW_NUMBER() OVER (ORDER BY ID DESC) idx ,* FROM USERS) temp WHERE idx BETWEEN (0*5) + 1 AND (1*5)
결과
'it > programming' 카테고리의 다른 글
[MS-SQL] 달력그려주는 쿼리 (0) | 2015.07.03 |
---|---|
[ASP classic] include 활용하기 (0) | 2015.06.30 |
[HTML] placeholder 에서 줄바꿈하기 placeholder line break character (2) | 2015.05.22 |