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 1002 게시물 읽기
No. 1002
도와주세요....ㅡ.ㅜ
작성자
김재경
작성일
2006-05-22 23:29
조회수
8,161

SELECT

H.SOSIKI_CD AS H_SOSIKI_CD ,H.HATYU_NO AS H_HATYU_NO ,H.INS_DT AS H_INS_DT ,H.HATYU_D AS H_HATYU_D ,H.TORIHIKI_KBN AS H_TORIHIKI_KBN ,H.KESSAI_TYP AS H_KESSAI_TYP ,H.TORIHIKI_CD AS H_TORIHIKI_CD ,T.TORIHIKI_NAM_F AS T_TORIHIKI_NAM_F ,H.BUNRUI_CD AS H_BUNRUI_CD ,H.NOHIN_D AS H_NOHIN_D ,H.MAX_NOHIN_D AS H_MAX_NOHIN_D ,H.UPD_ID AS H_UPD_ID ,H.HATYU_TYP AS H_HATYU_TYP ,R.HATYU_DTL_NO AS R_HATYU_DTL_NO ,R.SYOHIN_CD AS R_SYOHIN_CD ,R.SYOHIN_NAM_F AS R_SYOHIN_NAM_F ,R.IRI_SURYO AS R_IRI_SURYO ,R.CASE AS R_CASE ,R.BUNRUI_CD AS R_BUNRUI_CD ,R.HATYU_SURYO AS R_HATYU_SURYO ,R.HATYU_TANKA AS R_HATYU_TANKA ,R.HATYU_KIN AS R_HATYU_KIN ,R.KENPIN_SURYO AS R_KENPIN_SURYO ,R.CANCEL_SURYO AS R_CANCEL_SURYO ,R.MINYUKA_SURYO AS R_MINYUKA_SURYO

FROM

(TR_HATHED AS H LEFT OUTER JOIN MS_TORIHIKI AS T ON H.TORIHIKI_CD = T.TORIHIKI_CD) INNER JOIN TR_HATREC AS R

ON H.SOSIKI_CD = R.SOSIKI_CD AND H.HATYU_NO = R.HATYU_NO

where H.SOSIKI_CD IS NOT NULL order by H.SOSIKI_CD, H.HATYU_NO, R.HATYU_DTL_NO
위의 쿼리인데요...죄송합니다 보기 불편하시죠? 용서해주세요...;;

 

TR_HATHED테이블에는 프라이머리키(SOSIKI_CD, HATYU_NO) 말고는 인덱스가 없습니다.

TR_HATREC테이블에는 프라이머리키(SOSIKI_CD, HATYU_NO, HATYU_DTL_NO)와

인덱스(SYOHIN_CD, BUNRUI_CD)가 있습니다.

 

TR_HATHED 에는 7822701개의 레코드,

MS_TORIHIKI 에는 3254개,

TR_HATREC 에는 28699343개가 있습니다.

 

위의 3개 테이블을 조인해서 SELECT하는데 시간이 너무 오래걸립니다.

runstats로 갱신하고 속도가 조금 빨라졌지만 그래도 너무 오래걸립니다. 한 10분정도....ㅡ.ㅜ

 

고수님들의 한수 가르침을 받고 싶습니다. 어떻게 하면 얼마없는 인덱스를 태워서 속도를 올릴 수 있을까요

 

그리고 전체 검색을 하다가 SYSTEM FILE IS FULL이라는 에러도 여러번 조우했습니다..;;

 

이유와 해결방안도 알려주세요...부탁드립니다...


 

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

 

FROM (TR_HATHED AS H
        LEFT OUTER JOIN MS_TORIHIKI AS T ON
               H.TORIHIKI_CD = T.TORIHIKI_CD
     ) INNER JOIN TR_HATREC AS R ON
               H.SOSIKI_CD = R.SOSIKI_CD
           AND H.HATYU_NO = R.HATYU_NO
where H.SOSIKI_CD IS NOT NULL
order by H.SOSIKI_CD, H.HATYU_NO, R.HATYU_DTL_NO

================================================
TR_HATHED : +SOSIKI_CD+HATYU_NO P  7,822,701
TR_HATREC : +SOSIKI_CD+HATYU_NO+HATYU_DTL_NO P 28,699,343
            +SYOHIN_CD+BUNRUI_CD D
MS_TORIHIKI :      3,254   

 

H.SOSIKI_CD IS NOT NULL 이 부분에서 index를 사용하도록 해야 합니다.

H.SOSIKI_CD > '111' 이나 H.SOSIKI_CD like '111%' 등과 같은 형식으로 조건을 주어야 합니다.

 

도님이 2006-05-23 02:02에 작성한 댓글입니다. Edit

도님..항상 감사합니다..

전에 인덱스에 관한 질문을 두번 모두 답해주셨는데

감사하다는 말씀도 못드렸네요..죄송합니다

 

SOSIKI_CD IS NOT NULL부분은 jsp코딩상의 편의로 적어 놓은 것인데

SOSIKI_CD IS NOT NULL 을 SOSIKI_CD > '' 이렇게 고치면

인덱스를 탈 수 있을까요?

 

어디선가 저렇게 고치면 가능하다고 스쳐들은듯 싶어서요 ^^;

 

 

김재경님이 2006-05-23 09:03에 작성한 댓글입니다. Edit

SOSIKI_CD 에 null이나 '' 데이터가 많은 경우에는 SOSIKI_CD > '' 만으로도 효과가 있겠지만 이 테이블에서는 PK로 사용되니까 사용해도 도움이 안될거 같습니다.

 

조건으로 주어진 SOSIKI_CD의 범위가 너무 넓어지면 index를 사용하지 못하게 됩니다.

 

 

 

 

도님이 2006-05-23 11:13에 작성한 댓글입니다. Edit

도님 감사합니다...항상 얻기만 하는것 같아 죄송하네요

한가지 더 부탁드려도 괜찮을까요?

 

쿼리를 페이징으로 할까 하는 생각도 하고 있습니다.

그런데 도통 어떻게 페이징으로 쿼리를 수정해야할지 모르겠네요..

 

부탁드립니다

김재경님이 2006-05-24 10:17에 작성한 댓글입니다. Edit

부분범위 처리를 하려면

order by H.SOSIKI_CD, H.HATYU_NO, R.HATYU_DTL_NO

를 order by H.SOSIKI_CD, H.HATYU_NO로 해야만 합니다.

 

v8이라면 TR_HATHED 테이블의 순서만으로도 괜찮타면 이방법을 써보세요.

 

FROM (SELECT *

              FROM TR_HATHED H

           order by H.SOSIKI_CD, H.HATYU_NO

           FETCH FRIST 100 rows only)  H
               LEFT OUTER JOIN MS_TORIHIKI T ON
                             H.TORIHIKI_CD = T.TORIHIKI_CD
         ,TR_HATREC  R                          

where H.SOSIKI_CD IS NOT NULL

    AND H.SOSIKI_CD = R.SOSIKI_CD
     AND H.HATYU_NO = R.HATYU_NO
order by H.SOSIKI_CD, H.HATYU_NO, R.HATYU_DTL_NO

 

 

 

 

도님이 2006-05-24 11:05에 작성한 댓글입니다. Edit

도님 답변 감사합니다.

 

그런데 저희 DB가

Command Line Processor for DB2 SDK 7.2.5 입니다

이러면 v7인거죠?

그래서 그런지 쿼리가 먹질 않네요.....

 

오라클(거의 못만지지만....ㅡ.ㅜ)만 주로 만지다가 DB2할라니까

너무 힘드네요....ㅡ.ㅜ

 

 

김재경님이 2006-05-24 13:33에 작성한 댓글입니다. Edit

WITH TMP(SOSIKI_CD, H.HATYU_NO,RN) AS

SELECT SOSIKI_CD, HATYU_NO,ROWNUMBER() OVER() RN

   FROM TR_HATHED

ORDER BY SOSIKI_CD, HATYU_NO)

 

SELECT *

FROM TR_HATHED H1

               LEFT OUTER JOIN MS_TORIHIKI T ON
                             H.TORIHIKI_CD = T.TORIHIKI_CD
         ,TR_HATREC  R, TMP H2 

WHERE H2.RN<100

    AND H1.SOSIKI_CD = R.SOSIKI_CD
     AND H1.HATYU_NO = R.HATYU_NO

     AND H1.SOSIKI_CD = H2.SOSIKI_CD

     AND H1.HATYU_NO = H2.HATYU_NO
order by H1.SOSIKI_CD, H1.HATYU_NO, R.HATYU_DTL_NO

 

TR_HATHED 테이블의 인덱스만 읽어 temp table을 생성한 후 join하면 아쉬운대로 될것 같습니다.

도님이 2006-05-24 14:06에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1007ECF=0x9000001A File doesn't exist -- 도와주세요 [1]
반월성
2006-05-25
10310
1004[질문] 소숫점 절삭하는 함수에 대해서 질문드립니다. [1]
이준식
2006-05-23
9393
1003SQL1035N: The database is currently in use [1]
올아클
2006-05-23
6871
1002도와주세요....ㅡ.ㅜ [7]
김재경
2006-05-22
8161
1001jdbc type 3연결에 대해서 [1]
db2
2006-05-22
8012
1000DISTINCT 질문입니다.(초보) [1]
강세형
2006-05-22
6863
998SQL2025N An I/O error "-40" occurred on media "TSM".
db2
2006-05-20
5573
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다