database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
ㆍDB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DB2 Q&A 1380 게시물 읽기
No. 1380
대용량 select문 해결 방법 좀.
작성자
parkgoon
작성일
2007-07-04 17:43
조회수
9,217

       String query  = "SELECT  DVRDAT, DVRSNU, DVRSEQ, TSTDAT, TSTSKB, JMNAM2, CARSNA,"
                   + "    DVRCUD, DVRCOD, DVRTIK, DVRCAD, TSTPAM, DVRMNO, DVRSKB, CUSYNA,"
                   + "    TSTQTY, TSTDAN, TSTAMT, TSTPAM"
                 + "  FROM SALLIBR.SAKKHT"
                     + "  LEFT OUTER JOIN TFTLIBR.INVNDR V1 ON DVRCUD = V1.CUSCOA||V1.CUSCOB"
                     + "  LEFT OUTER JOIN TFTLIBR.SACAMS C1 ON DVRCAD = C1.CARC1||C1.CARC2||C1.CARC3||C1.CARC4"
                     + "  LEFT OUTER JOIN TFTLIBR.INITEM I1 ON DVRCOD = I1.JMCOD1||I1.JMCOD2||I1.JMCOD3||I1.JMCOD4"
                     + "  WHERE DVRSKB LIKE '" + sGubun + "%' AND DVRSNU LIKE '" + sJunno + "%'"
                     + "  AND DVRCUD LIKE '" + sVnrCod + "%' AND DVRCOD LIKE '" + sItemCod + "%';

       if (sSelectg.equals("1")) {
            query = query + " AND SUBSTRING(TSTDAT,1,4)||SUBSTRING(TSTDAT,5,2)||SUBSTRING(TSTDAT,7,2) BETWEEN '"+sFDate+"' AND '"+sTDate+"'";
            query = query + " AND SUBSTRING(DVRDAT,1,4)||SUBSTRING(DVRDAT,5,2)||SUBSTRING(DVRDAT,7,2) BETWEEN '"+sCFDate+"' AND '"+sCTDate+"'";
          query = query + " ORDER BY TSTDAT, DVRCUD, DVRSNU,  DVRCOD, DVRSEQ, TSTSKB";


         }
       else if (sSelectg.equals("2")) {
            query = query + " AND SUBSTRING(TSTDAT,1,4)||SUBSTRING(TSTDAT,5,2)||SUBSTRING(TSTDAT,7,2) BETWEEN '"+sFDate+"' AND '"+sTDate+"'";
            query = query + " AND SUBSTRING(DVRDAT,1,4)||SUBSTRING(DVRDAT,5,2)||SUBSTRING(DVRDAT,7,2) BETWEEN '"+sCFDate+"' AND '"+sCTDate+"'";
          query = query + " ORDER BY DVRDAT, DVRSNU, TSTDAT,  DVRSEQ, DVRCOD, TSTSKB";
           }
       else if (sSelectg.equals("3")) {
            query = query + " AND SUBSTRING(TSTDAT,1,4)||SUBSTRING(TSTDAT,5,2) = '"+sTYMDate+"'";
            query = query + " AND SUBSTRING(DVRDAT,1,4)||SUBSTRING(DVRDAT,5,2)||SUBSTRING(DVRDAT,7,2) BETWEEN '"+sCFDate+"' AND '"+sCTDate+"'";
          query = query + " ORDER BY DVRCUD, TSTDAT, DVRSNU,  DVRCOD, DVRSEQ, TSTSKB";
         }


현재 jsp이용해서 프로그램 개발을 하고 있습니다.
그런데, 이것을 한 페이지에 보여주다 보니..기간설정이 크면 읽어오는 데이터 양이 많아서 그런지 뿌려주는 속도가 넘 느립니다.
그래서 페이징을 해보려고 하는데..

rownum이나 limit등..다른 문들도 상관은 없습니다.

표기 할 수 있는 방법이 없을까요..

이 글에 대한 댓글이 총 1건 있습니다.

JSP에 대해선 잘모르지만 쿼리를 좀수정하면 빨라질듯 합니다.

1. TFTLIBR.INVNDR, TFTLIBR.SACAMS, TFTLIBR.INITEM 의 인덱스 필드가 뭔지 모르겠지만
   V1.CUSCOA, V1.CUSCOB, C1.CARC1, C1.CARC2, C1.CARC3, C1.CARC4
   I1.JMCOD1, I1.JMCOD2, I1.JMCOD3, I1.JMCOD4가 인덱스필드들 이라면 || 때문에
   인덱스 못탈겄같네요(인덱스 필드를 가공하면 인덱스 못탐)
   ON DVRCUD = V1.CUSCOA || V1.CUSCOB -->
   ON V1.CUSCOA = SUBSTR(DVRCUD,n,n) AND V1.CUSCOB = SUBSTR(DVRCUD,n,n) 이런식으로
   인덱스를 가공하지않으면 결과가 빠를것갔습니다.

2. WHJERE 절에서
   AND SUBSTRING(TSTDAT,1,4)||SUBSTRING(TSTDAT,5,2)||SUBSTRING(TSTDAT,7,2) BETWEEN 는
   AND SUBSTRING(TSTDAT,1,8) BETWEEN 이나 그냥 TSTDAT BETWEEN 아닌가요?


3. 전체적으로
   SELECT ...
     FORM TABLE
     LEFT JOIN TABL
     .
     .
   WHERE 조건....  구조를

   SELECT ...
     FORM (
       SELECT *
         FORM TABLE
        WHERE 조건....) T1
     LEFT JOIN TABL
     .
     . 로 변경하면

기본 테이블에서 조건에 맞는 것만 가지고 조인하기 떄문에
제경험으로 결과가 클때는 속도가 향상됩니다.

박진복(pjb708)님이 2007-07-19 13:19에 작성한 댓글입니다.
이 댓글은 2007-07-19 13:35에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
1384일년 중 토요일과 일요일의 날짜만 가져오려면? [2]
jeje
2007-07-17
8464
1383파일내용 load시 한글이 깨져서 입력이 됩니다. [2]
하늘호수
2007-07-09
8734
1382파일내용 load시 일부항목이 삭제됨 [1]
하늘호수
2007-07-09
8379
1380대용량 select문 해결 방법 좀. [1]
parkgoon
2007-07-04
9217
1378조인 관련 질문 드림니다.ㅠㅠ [1]
LoverDB
2007-07-04
7922
1377select 안에 select 가 가능 한가요..... [3]
초보
2007-07-03
8422
1376where 절에 if 문과 같이 쓸수있나요....... [2]
초보
2007-07-03
8395
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다