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 38784 게시물 읽기
No. 38784
마농님 튜닝 부탁드립니다.
작성자
이강실(lksil1004)
작성일
2011-08-16 18:43ⓒ
2011-08-16 18:44ⓜ
조회수
4,886

안녕하세요. 마농님

마농님의 쿼리를 보면서 많이 배우는 사람입니다.

오늘은 좀 난감한 문제가 있어서 도움을 청합니다.

            DELETE FROM ERPIF.T_SALESDETAIL A
             WHERE EXISTS (
                           SELECT  1   FROM  ERPIF.T_SALES B
                            WHERE  B.VBELN       =  A.VBELN
                                   AND  '20060101'    > (
                                                                           SELECT  MAX(C.BILL_DT)
                                                                                FROM  ERPIF.T_SALES C
                                                                             WHERE  B.CAR_NO  = C.CAR_NO
                                                                             GROUP  BY CAR_NO
                                                                         )
                                           );

위와같이 쿼리를 작성하였는데 그룹바이로 소트를 하지않고 원하는 값을 축출하고 싶습니다.

T_SALESDETAIL은 8000만건이고 T_SALES는 3000만건입니다.

CAR_NO 와 BILL_DT 는 단독인덱스로 존재합니다.

감사합니다.

 

 

 

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

정보가 부족하네요.

각 테이블의 키는 무었인가요?

쿼리에 대한 간략한 설명도 있으면 좋겠네요.

마농(manon94)님이 2011-08-16 23:53에 작성한 댓글입니다.

WITH T_H AS
( SELECT '01' VBELN, '000000' CAR_NO, '20010101' BILL_DT FROM DUAL
UNION ALL SELECT '02', '000000', '20020101' FROM DUAL
UNION ALL SELECT '03', '000000', '20030101' FROM DUAL
UNION ALL SELECT '04', '111111', '20040101' FROM DUAL
UNION ALL SELECT '05', '111111', '20050101' FROM DUAL
UNION ALL SELECT '06', '111111', '20060101' FROM DUAL 
UNION ALL SELECT '06', '111111', '20070101' FROM DUAL
)
, T_D
(SELECT '01' VBELN, '01' SEQ, 'AAAA' ETC FROM DUAL
UNION ALL SELECT '01', '02', 'BBBB' FROM DUAL
UNION ALL SELECT '01', '03', 'CCCC' FROM DUAL
UNION ALL SELECT '04', '01', 'AAAA' FROM DUAL
UNION ALL SELECT '04', '02', 'BBBB' FROM DUAL
UNION ALL SELECT '04', '03', 'CCCC' FROM DUAL
UNION ALL SELECT '04', '04', 'DDDD' FROM DUAL
)
SELECT A.* FROM T_D A
 WHERE EXISTS (
                SELECT 1
                  FROM T_H B
                 WHERE A.VBELN = B.VBELN
                   AND '20060101'  >   (SELECT MAX(C.BILL_DT)
                                          FROM T_H C
                                         WHERE B.CAR_NO = C.CAR_NO
                                         GROUP BY CAR_NO)         
              ) 

위에서와 같이 DETAIL을 삭제하려고 합니다.
삭제 대상은 HEAD의 정비일자중 20060101 이후에 정비를 받지 않는
차량을 삭제하려고 합니다.
HEAD와 DETAIL은 VBELN으로 연결되어 있고
인덱스 정보는 CAR_NO 와 BILL_DT가 단독 인덱스로 잡혀있습니다.

위에서와 같이 그룹바이로 처리하면 SORT가 발생하여
속도 저하가 발생하여 저 부분을 부분범위처리로 대체하고 싶습니다.
부탁드립니다~^^

 

이강실님이 2011-08-17 09:52에 작성한 댓글입니다.
이 댓글은 2011-08-17 09:53에 마지막으로 수정되었습니다. Edit

SELECT a.*
  FROM t_d a
 WHERE EXISTS (SELECT 1
                 FROM t_h b
                WHERE a.vbeln = b.vbeln
                  AND NOT EXISTS (SELECT 1
                                    FROM t_h c
                                   WHERE b.car_no = c.car_no
                                     AND c.bill_dt >= '20060101'
                                  )        
               )
;

vbeln 인덱스와 car_no + bill_dt 인덱스가 있어야 합니다.

마농(manon94)님이 2011-08-17 11:07에 작성한 댓글입니다.

마농님 감사합니다.

마농님이 달아주시는 쿼리로 많이 공부하고 있습니다^^

좋은 하루되세요~

 

 

 

이강실님이 2011-08-17 11:29에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38787버퍼캐쉬를 안쓰고 쿼리하려면... [4]
김진국
2011-08-17
9058
38786쿼리문의(dummy table..) [5]
레이첼
2011-08-17
5003
38785escape 문자에 관련하여 질문하나만 드리겠습니다. [1]
조용호
2011-08-17
3661
38784마농님 튜닝 부탁드립니다. [4]
이강실
2011-08-16
4886
38783두개의 쿼리가 결과값이 다른데...같게 맞추고 싶은데~~ [5]
한상원
2011-08-16
3973
38782Hot백업복구시 redo로그파일이 없다면, 어디까지 복구가능한가? [1]
이태훈
2011-08-16
5821
38781imp 오류 [2]
초보
2011-08-16
6775
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다