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 1275 게시물 읽기
No. 1275
delete 서브쿼리 실행 횟수에 대해..
작성자
db2멍
작성일
2007-03-09 01:18ⓒ
2007-03-09 01:37ⓜ
조회수
8,021


delete from part_user where p_id in (select p_id from part where part_name = '기획')

위와 같은 쿼리가 있습니다.

part : part_user = 1 : N의 관계입니다.

part 에는 대략 80만건의 데이터가 있고,
part_user에는 대략 800만건의 데이터가 있습니다.
part_user의 p_id에는 인덱스가 걸려있으며 part의 p_id는 기본키이구요..

근데 실행속도가 만족스럽질 못하네요 대략 18초 정도 걸립니다.
실제 지워질 데이터는 몇십개정도입니다.

아무래도 서브쿼리가 part_user의 row를 검사할때마다 한번씩 실행되는거 같은데,

왜 결과가 똑같이 나오는 쿼리를 part_user의 row 마다 실행하도록 db2를 만들었을까요... ㅡㅡ;; (잘못알고 있는건가...)

저 서브쿼리를 한번만 실행하고 해당되는 데이터만 삭제할 수 없을까요 ?

괄호안의 서브쿼리에서 걸러져 나온 데이터를 직접 열거해주면 0.5초도 안걸립니다.

delete from part_user where p_id in (values (100), (108), (109), (120), (180), (192), (228), ...)

단순한 생각으로는 서브쿼리 먼저 실행해서 나온데이터로 인덱스 비교하면 간단하게 부분추출 가능하리라 생각되는데

왜 저렇게 무식하게 돌면서 시간을 잡아먹으면서 동작해야 하는지...

exist문을 사용해봤으나 거의 대동소이합니다.

현재는 부모 테이블 데이터를 먼저 select 해와서 프로그램 단에서 delete 쿼리를 가변적으로 만든다음

위처럼 데이터를 열거해서 쿼리를 실행해 속도를 어느정도 내고는 있으나, 좀 찜찜하고...

또다른 테이블은 관계가 1:N:M:O 이렇게 부모자식 관계가 연속적으로 있어서

위의 방법도 한계가 있습니다. ㅡㅡ;;

저 서브쿼리를 한번만 실행하거나, 조인해서 삭제하거나 뭐 그런 방법이 없을까요 ?

막연한 생각으로 질문하는것 같지만 별거 다해보고

제 머리로는 더이상 해답이 나오질 않아서 질문드리는것이니

힌트라도 좀 주시길 바랍니다.

udb 7.2 for linux를 사용하고 있습니다.

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

제 생각에는 part 테이블에서 p_id를 찾는 시간이 오래걸리는 것으로 보입니다. 
time db2 "select p_id from part where ~ " 를 했을때 얼마나 걸리는지 테스트를 해보세요. 
이것이 바로 되면 오래 걸릴 부분은 없어보입니다. 

삭제대상 p_id를 찾기위해 part를 조회하는 부분에서 index를 제대로 사용하지 못하는 것으로 보입니다. 
조건에 맞는 index가 있는지 보시고 있는데도 index를 사용하지 못하면 runstats를 돌린 후 다시해보세요.

마라도님이 2007-03-09 11:12에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1278답답한 마음에 글을 올립니다..오라클에서 테이블의 정보를 보려고 작성한건데 이번에 DB2를 사용하는대 잘 모르겠네여......아시는 분은 컨버전좀 부탁드립니다. [1]
튼솔
2007-03-10
7721
1277데이터베이스간 자료공유가 가능한가요.? [1]
최홍창
2007-03-09
7805
1276외래키 제약조건 기능 오류에 대해..
db2멍
2007-03-09
7061
1275delete 서브쿼리 실행 횟수에 대해.. [1]
db2멍
2007-03-09
8021
1274db2 archive log 명령어는 뭐하는 기능인지요 [1]
유성현
2007-03-08
7512
1273db2flsn 명령어에 대해서 질문입니다. [1]
db2초보
2007-03-08
6811
1272합이 9 이 되는 숫자들을 쿼리할려면
배성수
2007-03-07
6730
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다