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를 사용하고 있습니다. |