복붙노트

[SQL] 대량으로 PostgreSQL을 만 새로운 행을 삽입하는 방법

SQL

대량으로 PostgreSQL을 만 새로운 행을 삽입하는 방법

단지 제목 - 나는 ID가없는 제품 (300 만 개 항목)의 목록을 가지고있다. 그러나 나는 이미 DB에 존재하는 제목 모른다. 신제품 (만 2.9에 대한 항목) DB에 추가해야합니다. 그 후 나는 각 제품 ID (신규 및 기존)를 알고 있어야합니다.

PostgreSQL의에서 할 수있는 가장 빠른 방법이 있나요? 나는 (추가 기본값 등 열을 추가) 필요에 따라 DB를 변경할 수 있습니다.

해결법

  1. ==============================

    1.목표 테이블에 복사 임시 준비 테이블에 이르기까지 모든 및 삽입에만 새로운 제목.

    목표 테이블에 복사 임시 준비 테이블에 이르기까지 모든 및 삽입에만 새로운 제목.

    CREATE TEMP TABLE tmp(title text);
    
    COPY tmp FROM 'path/to/file.csv';
    ANALYZE tmp;
    
    INSERT INTO tbl
    SELECT DISTINCT tmp.title
    FROM   tmp 
    LEFT   JOIN tbl USING (title)
    WHERE  tbl.title IS NULL;
    

    ID는 TBL에 직렬 컬럼 tbl_id 자동으로 생성한다.

    왼쪽은 / NULL 구조체의 못해도는 기존 IS 타이틀 가입. NOT 또 다른 가능성 것이 존재한다.

    DISTINCT 방지는 임시 테이블의 tmp에서 들어오는 데이터를 복제합니다.

    ANALYZE 확실히 쿼리 계획은 현명한 계획을 선택합니다 만들기 위해 유용하고, 임시 테이블은 자동 진공에 의해 분석되지 않습니다.

    당신이 3 개 백만 항목이 있기 때문에, (이 세션에만 해당) temp_buffer에 대한 설정을 높이기 위해 비용을 지불 할 수 :

    SET temp_buffers = 1000MB;
    

    아니면 아무리 당신이 감당할 훨씬 빠른 인 RAM에 임시 테이블을 저장하기에 충분하다 할 수 있습니다. 참고 : - 모든 임시 객체가 생성되기 전에 세션에서 먼저 수행해야합니다.

    가져온 데이터에 대한 모든 ID를 확인하려면 :

    SELECT tbl.tbl_id, tbl.title
    FROM   tbl
    JOIN   tmp USING (title)
    

    같은 세션에서! 임시 테이블은 세션이 끝날 때 자동으로 삭제됩니다.

  2. from https://stackoverflow.com/questions/15834569/how-to-bulk-insert-only-new-rows-in-postresql by cc-by-sa and MIT license