2017-10-03 9 views
0

필자는 원격 소스에서 주기적으로 레코드 묶음 (10 분 간격으로 5k 레코드까지)을 삽입해야하는 프로젝트가 있습니다. 나는 최종 테이블 (동일한 기본 키, id는 varchar이고 고유하지 않음)과 동일한 구조를 가진 스테이징 테이블을 가지고 있으므로 중복이 없도록 다음 SQL 명령을 사용하고 있습니다.이 인서트는 안전한가요?

insert into g_his 
select * 
from tmp_his h 
where not exists (select id, times 
        from g_his g 
        where g.id = h.id 
        and g.times = h.times); 

이 작업이 끝나면 tmp_his 테이블이 잘립니다.

g_his 테이블에 대한 암시 적 잠금을 가져오고 다른 삽입을 방지 할 수 있습니까? 아니면 무거운 짐일까요? 아니면 더 좋은 생각 이니?

DB는 스테이징 테이블의 ID에 아무런 제약이없는 이유는 포스트 그레스는 9.6

+1

g_his(id, times)에 고유 제한 조건을 만들고 사용입니까? 스테이징 테이블에 제약 조건이있는 경우 insert 문에없는 제약 조건이 필요하지 않을 수 있습니다. 그러면 성능이 향상됩니다 – Valli

+0

기본 키가 없습니까? 고유하지 않습니까? 당신이 무정부 상태가되고 싶다면 당신은 그것을 얻을 것입니다. – tadman

+0

때로는 스테이징 테이블의 경우 데이터를 쉽게 가져올 수 있으며 정리를 걱정할 필요가 없습니다 ... 종종 제한없이 스테이징하는 경우가 있습니다. – jleach

답변

0

INSERT INTO g_his 
    SELECT * 
    FROM tmp_his h 
ON CONFLICT (id, times) DO NOTHING; 
+0

항상 기존 시스템이므로, 우리는 이미이 두 컬럼에 대한 색인을 가지고 있습니다. 나는 그것이 될 수 있는지 살펴보고 이런 방향으로 가려고합니다. 감사. – posthy