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
운영게시판
최근게시물
Oracle Q&A 40885 게시물 읽기
No. 40885
SQL 좀 봐주세요.
작성자
이현정
작성일
2015-07-30 18:22
조회수
8,235

마농님 여러모로 많은 도움을 받았는데... 인사도 변변치 못했네요.

이자리를 빌어 다시 한번 감사드립니다.

                 SELECT CEIL(COUNT(*)/1000)
                  FROM PROJ_TAG A,
                       (SELECT CT_NO, TG_NO,SE_CD
                          FROM PROJ_TAG_ITR
                       WHERE DECODE(CN_NO,'IC',SE_CD,'AT') = 'AT'
                      GROUP BY CT_NO, TG_NO,SE_CD) C
                   WHERE 1=1
                     AND A.CT_NO = C.CT_NO
                     AND A.TG_NO = C.TG_NO
                     AND A.TRNS_YN = 'N'
                     AND ROWNUM <= 1000


ID PID Operation                                                     Name                                        Rows        Bytes              Cost CPU     Cost IO Cost
0  SELECT STATEMENT                                                                                                 1              69          7694  938M 7641
1 0   SORT AGGREGATE                                                                                                  1            69      
2 1     COUNT STOPKEY           
3 2       NESTED LOOPS                                                                                            17954  1209K 7694    938M 7641
4 3         NESTED LOOPS                                                                                         17954  929K 7692       933M 7640
5 4           VIEW                                                                                                             17912  384K 3212      894M 3162
6 5             HASH GROUP BY                                                                                    17912  437K 3212      894M 3162
7 6               INDEX FAST FULL SCAN                  PROJ_TAG_ITR_PK               17912  437K 3211     865M 3162
8 4           TABLE ACCESS BY INDEX ROWID       PROJ_TAG                            1  31  1  2173  1
9 8             INDEX UNIQUE SCAN                          PROJ_TAG_PK                       1    1  263  1

 


A 5만건입니다.(문제가 없습니다.)

문제는 C인데 C는 200만건이 GROUP BY 하면 120만건입니다.
중복되는 데이터를 빼고 COUNT 해야해서 GROUP BY 를 합니다.
여기서 시간을 다 잡아 먹습니다.

두개가 조인을 합니다.
그래서 건수가 1000<= 빠져나오고 1을 다른 곳에 보내 주는 업무인가 봅니다.

이게 2분~3분을 소요 합니다.

A 테이블은 PK(A.CT_NO,A.TG_NO)
C 테이블은 PK(CT_NO, TG_NO, SE_CD ,GN_SL)


속도 개선 방법이 있을까요?
아무리 생각해도 ~~~ ^^; 

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

 짧은 견해지만 말씀을 드리면

 

먼저 A.TRNS_YN이 아마도 FLAG 성일 듯 싶습니다.

 

대개의 경우 이런 경우 'Y' : 'N' 의 비율이 'Y'가 많습니다.

님의 경우도 그럴 가능성이 있습니다. (왜냐면 주로 'N'의 의미가 미처리 같은 경우가 많으니까)

 

그리고 C 쪽 테이블은 TRANS를 위한 전제 조건으로 존재 검증을 위해 필요한 부분으로 보입니다.

 

만약 그렇다면 TRNS_YN에 'N' 인경우만 인덱스가 만들어지게 함수기반 인덱스를 만드시고

INDEX-FULL 보다 EXISTS를 사용하도록 유도하는 것이 더 빠를 수 있습니다.(어차피 위의 경우를 보면 A,C는 NL로 돕니다. -만약 이런 전제가 아니라면 A,C를 HASH 조인이 되도록 유도하시는 쪽이 나아보입니다.)

 

그런데 지금 말씀드린 것은 어디까지나 데이타 구성이 어떨 경우 어떻게 해보시라는 뜻이므로

먼저 데이타 구성을 확인하시는 것이 좋습니다.

김흥수(protokhs)님이 2015-07-31 11:49에 작성한 댓글입니다.
이 댓글은 2015-07-31 11:50에 마지막으로 수정되었습니다.

오호 감사합니다.

hash로 푸니까. 2분에서 20초로 내려 왔습니다.

감사합니다.

이현정님이 2015-07-31 15:51에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40888pl/sql htp.p기능을 통해 사원조회 수정 삭제기능을 만드려고하는데
천범석
2015-08-03
7203
40887계층구조 데이터 구해오기[내용수정] [2]
초보
2015-07-31
7935
40886잘 이해가 안되는 SQL 결과에 대하여 질문을 드립니다. [3]
김흥수
2015-07-31
7766
40885SQL 좀 봐주세요. [2]
이현정
2015-07-30
8235
40884PL/SQL에서 TABLE명을 변수로 받아서 CURSOR 실행법..? [3]
초보자
2015-07-30
7939
40883특정 문자를 제거 후 (하이픈) 데이타 출력 방법 좀 알려 주세요. [2]
밥님
2015-07-29
7774
40882오라클 특수문자 깨짐 [1]
shrek
2015-07-28
23159
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다