오라클 10버전을 사용중입니다.
현재 API데이터를 호출해서 매 호출당 500건씩 INSERT하는 기능을 만들고 있습니다.
1. 매 호출당 500건씩 INSERT하는데 적게는 3천건 많게는 20만건까지 등록됩니다.
(호출데이터가 3천건이면 500건씩 6번반복)
2. INSERT할때 PK 체크를 하여 중복값은 INSERT가 되면 안됩니다.
현재 위와같은 상황입니다.
INSERT INTO UNION ALL을 사용하였고 PK중복 제외조건을 추가하였습니다.
INSERT INTO TABLE_NAME (A, B, C)
SELECT 'A', 'B', 'C' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM TABLE_NAME2 WHERE A = 'A') UNION ALL
SELECT 'B', 'C', 'D' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM TABLE_NAME2 WHERE A = 'B') UNION ALL
SELECT 'C', 'D', 'E' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM TABLE_NAME2 WHERE A = 'C')
위와같은 형태로.. 한번에 500건씩 insert하는데 500건당 시간이 1~2분이 넘게 걸리는 상황입니다.
그렇다고 INSERT를 한번씩 호출하려니 자바쪽에 부담이 되는거같고..
어떤 방식으로 진행하면 시간이 단축되는지 궁금합니다.
merge 문은 성능이 어떨까요?
MERGE INTO TABLE_NAME USING (SELECT 'A' A, 'B' B, 'C' C FROM DUAL) DUMMY ON (TABLE_NAME.A = DUMMY.A) WHEN NOT MATCHED THEN INSERT (A,B,C) VALUES (DUMMY.A, DUMMY.B, DUMMY.C) ;
merge문은 한번의 쿼리로 다중insert가 가능하나요?? 찾아보고 있는데 잘 안나오네요ㅠㅠ
using 절에 insert 하시려는 select 문장을 쓰시면 될듯합니다.
MERGE INTO TABLE_NAME USING ( SELECT 'A' A, 'B' B, 'C' C FROM DUAL UNION ALL SELECT 'B', 'C', 'D' FROM DUAL UNION ALL SELECT 'C', 'D', 'E' FROM DUAL ) DUMMY ON (TABLE_NAME.A = DUMMY.A) WHEN NOT MATCHED THEN INSERT (A,B,C) VALUES (DUMMY.A, DUMMY.B, DUMMY.C) ;
감사합니다! 다른 급한부분 해결하고나서 바로 사용해보겠습니다!
10g 에서 되는지 모르겠네요
insert all 로 여러건씩 넣어서 처리한적 있습니다.
생각보다 성능이 괜찮았습니다
감사합니다! insert all when은 안써봤는데 사용이 되는지 확인해보겠습니다!