강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

게시판에서 페이징 쿼리
작성자 : 13 김영철
등록날짜 : 2009.01.23 01:27
2,025

자바 사이트들( 자바서비스나 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단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
2565 문자열에서 단어 분리 - SQL Server 2005 M 최고의하루 12.23 2397
2564 25가지 SQL작성법-3 M 최고의하루 12.23 2132
2563 25가지 SQL작성법-2 M 최고의하루 12.23 2410
2562 25가지 SQL작성법-1 M 최고의하루 12.23 2132
2561 제약조건(1) M 최고의하루 12.20 3645
2560 [MSSQL]SQL Server Management Studio Express M 최고의하루 12.20 2619
2559 Microsoft SQL Server 2005 Express Edition SP2 M 최고의하루 12.19 2331
2558 Microsoft SQL Server Management Studio Express SP2 M 최고의하루 12.19 2408
2557 [MSSQL] 데이터 백업과 복구 ( SQL SERVER ) M 최고의하루 12.18 2686
2556 [ Sybase ] Sybase 기본 명령어 M 최고의하루 12.18 2816
2555 오라클(Oracle) 10g Database 설치 M 최고의하루 12.04 3133
2554 오라클데이터베이스 복구 M 최고의하루 12.04 2200
2553 MSSQL에서 문자로 된 날짜 시간 차이값 얻기 13 김영철 01.24 3712
2552 T-SQL 페이징 구현하기 13 김영철 01.24 2748
2551 데이터가 저장되는 형태와 인덱스 페이지 13 김영철 01.23 1395
2550 SQL Server 2000의 현재 버전 확인 13 김영철 01.23 2104
2549 유용한 SQL 쿼리 13 김영철 01.23 1876
2548 [MSSQL] 게시판 페이징 쿼리 13 김영철 01.23 2467
열람중 게시판에서 페이징 쿼리 13 김영철 01.23 2026
2546 테이블의 레코드 총 개수 얻기 좀 더 빠른 방법 13 김영철 01.23 2026
2545 데이터베이스 내에 있는 모든 테이블의 row 수와 용량 구하기 13 김영철 01.23 2045
2544 저장프로시저 디버깅 준비 13 김영철 01.23 2081
2543 [MS-SQL] Parameters 를 이용한 쿼리실행 13 김영철 01.23 2872
2542 MS SQL 서버 확장 스토어드 프로시저 만들기 13 김영철 01.23 2987
2541 MS-SQL에서 개선된 페이징 쿼리 13 김영철 01.23 2720
2540 MS-SQL Server Transaction Isolation Level 13 김영철 01.23 2595
2539 다른 서버로 DB 백업 받기 13 김영철 01.23 2198
2538 MSSQL 내장 함수 목록 13 김영철 01.23 2135
2537 몇가지 sql 명령어 13 김영철 01.23 2873
2536 명령어정리 13 김영철 01.23 1708
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취