자바 사이트들( 자바서비스나 okjsp )을 보면 게시판 답변형/비답변형 으로 나눠서 페이징 쿼리에 대해 ( 1초 게시판 이라던지… ) 얘기가 자주 나옵니다.
디비 성능을 위해 페이징이란건 피해갈 수 없는 상황이고 저 사이트들에 나오는 내용은 복잡해서 당췌 이해도 잘 안가고 -_- ( 저만 그런거라면 낭패… )
현재 대부분의 사이트에서 인정하는 최고 성능의 페이징 쿼리는
현재 페이지를 값으로 넘겨서 다음 페이지를 계산하는 방식입니다.
보통 페이징이라고 하면 넘어가는 값이 검색을 제외하면 페이지당글수와 페이지번호 2가지 인데 위의 방식을 사용하려면 페이지당글수 / 요청페이지번호 / 현재페이지번호 3개의 값을 언제나 주고 받아야 합니다.
익숙한 방법이 아니라서 설명 보면 이해는 되겠지만 실제로 저렇게 코딩하고 싶진 않네요 -_- 귀찮아요..
실제로 자주 만들게 되는 게시판들은 수십만건의 데이터에 수백명이 한꺼번에 달라붙는 사이트도 아니라서 꼭 저 정도까지는 아니어도 되지 않을까 스스로 변명해 봅니다.
그래서 주로 쓰는 쿼리 3가지 정도를 실제로 테스트 해 봤습니다.
데이터는 10,000 건을 집어 넣은 테이블 하나로 했고 답변형이 아닌 비답변형 게시판 입니다.
SELECT *
FROM (
SELECT (TOTAL_COUNT - ROWNUM + 1) AS SEQ, ARTICLE_ID, TITLE, VIEW_CNT ,
TO_CHAR(CREATE_DATE, 'yyyy-MM-dd') AS CDATE, TOTAL_COUNT,
CEIL(ROWNUM / 10) AS PAGE, CEIL(TOTAL_COUNT / 10) AS TOTAL_PAGE
FROM (
SELECT /*+ index_desc(TBL_W_BOARD_ARTICLES SYS_C003574) */ARTICLE_ID, TITLE, VIEW_CNT , CREATE_DATE
FROM TBL_W_BOARD_ARTICLES
ORDER BY ARTICLE_ID DESC
),
(
SELECT COUNT(ROWID) AS TOTAL_COUNT
FROM TBL_W_BOARD_ARTICLES
)
)
WHERE PAGE = 1
두번째 방법
SELECT *
FROM (
SELECT /*+ index_desc(TBL_W_BOARD_ARTICLES SYS_C003574) */ARTICLE_ID, TITLE,
VIEW_CNT , CREATE_DATE , TOTAL_COUNT ,
rownum , floor((rownum - 1 ) / 10 ) page
FROM (
SELECT ARTICLE_ID, TITLE, VIEW_CNT ,
TO_CHAR(CREATE_DATE, 'yyyy-MM-dd') CREATE_DATE , TOTAL_COUNT
FROM TBL_W_BOARD_ARTICLES ,
(
SELECT COUNT( ARTICLE_ID ) TOTAL_COUNT
FROM TBL_W_BOARD_ARTICLES
)
ORDER BY ARTICLE_ID DESC
)
)
WHERE page = 0
세번째 방법
SELECT *
FROM (
SELECT /*+ index_desc(TBL_W_BOARD_ARTICLES SYS_C003574) */ ROWNUM RSEQ , ARTICLE_ID, TITLE,
VIEW_CNT , TO_CHAR(CREATE_DATE, 'yyyy-MM-dd') CREATE_DATE , TOTAL_CNT
FROM TBL_W_BOARD_ARTICLES ,
(
SELECT COUNT( ARTICLE_ID ) TOTAL_CNT
FROM TBL_W_BOARD_ARTICLES
)
WHERE ROWNUM <= 10
)
WHERE RSEQ > 0
ORDER BY ARTICLE_ID DESC
여태 사용하던 쿼리는 2번째 방법에서 글목록만 가져오고 따로 카운트를 구하는 쿼리를 날리는 거였는데 두번 쿼리를 날리는 것보다는 한번에 가는게 좋을 것 같아 하나로 합쳐 봤습니다.
가능한 동일한 조건을 위해 동일한 인덱스 사용에 동일한 컬럼 조회와 형변환( TO_CHAR ) , 동일한 페이지(1페이지)를 조회 했습니다.
1번 방법 – 130 ms ~ 140 ms
2번 방법 – 120 ms ~ 130 ms
3번 방법 – 10 ms ~ 20 ms
3번 방법이 가장 빠른걸로 나왔습니다.
1페이지가 아닌 마지막 페이지를 조회한 경우
1번과 2번은 비슷한 속도가 걸렸지만 3번은 50-60 정도가 나왔습니다.
건수가 몇십만건 몇백만건이 된다면 3번 속도가 더 느려질지 모르겠지만 우리가 주로 사용하는 게시판에서는 3번 방법이 가장 알맞지 않을까 합니다.
그리고 쿼리도 가장 짧습니다. 흐흐흐
[출처] 메롱
"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기, 각종 광고, 영업, 판매, 제안서, 전단지 반응율 3배×10배 이상 높이는 마법의 8단계 공식" |
![]() |
☞자세히보기 |
|
|