A 테이블에
CITY, LAL, RAN 컬럼이 PK로 잡혀있고,
B 테이블에 위 세개 컬럼이 FK로 잡혀있는 상태입니다.
그런데, 중간에 작업이 있어 해당 FK를 비활성화 시킨 상태에서 작업 종료 후 다시 활성화 시키려니 오류가 나네요.
아무래도 FK에 해당하지 않는 값들이 있어서 그런것 같은데, 어떻게 하면 문제되는 데이터들을 가져올 수 있을까요?
참고로... A테이블은 500만, B테이블은 4억건정도 존재하고 있는 상태입니다.
원래는
select * from A
where (city, lal, ran) not in (select city, lal, ran from B group by city, lal, ran);
이렇게 검색해서 해당되는걸 솎아낸 후 다시 b테이블에서 검색할 생각이었는데, 이마저도 검색이 힘드네요... 휴;
SELECT *
FROM A
WHERE NOT EXISTS (SELECT 1
FROM B WHERE CODE = A.CITY)
UNION ALL
SELECT *
FROM A
WHERE NOT EXISTS (SELECT 1
FROM B WHERE CODE = A.LAL)
UNION ALL
SELECT *
FROM A
WHERE NOT EXISTS (SELECT 1
FROM B WHERE CODE = A.RAN)
이런 식으로 조회해보면 되지 않을까요?
--
아 세 개가 동시에 fk로 걸려 있는 거군요;; 난독;;
-- CITY, LAL, RAN 3개 컬럼이 pk라고 했으니 3개를 다 비교해야 할듯 합니다. -- 그리고 B 테이블에 FK로 걸려 있다고 하시니 INDEX가 있으리라 보고 GROUP BY를 하면 로우수를 좀 줄이겠네요.. -- 인덱스가 없다면 GROUP BY를 쓰지 마시고... SELECT CITY, LAL, RAN FROM B GROUP BY CITY, LAL, RAN Minus Select CITY, LAL, RAN From A
SELECT b.city, b.lal, b.ran FROM b , a WHERE b.city = a.city(+) AND b.lal = a.lal (+) AND b.ran = a.ran (+) AND a.city IS NULL ;
4억건이면 데이터가 많네요.
4억건 전체를 대상으로 검색하는 것 보다는
작업대상만 골라낼 수 있는 방법(원본 테이블 존재, 등록일시 확인 등)을 찾아서
해당 자료만을 대상으로 검색하시는 게 좋겠네요.