psycopg 대용량 데이터 삽입 속도 향상

헬리코박도·2022년 7월 26일
0

문제

약 14만 건의 데이터를 외부 api에서 python을 통해 postgresql로 넘기는 코드를 작성했었다.
psycopg 라이브러리를 사용하여 작성하였는데 단순하게 14만 건을 반복하며 insert문을 db로 쏘니 100초라는 매우 긴 시간이 소요되었다.

해결

이를 줄이기 위해 대용량 데이터 삽입(bulk insert)를 검색하다 보니 대용량 데이터를 삽입할 때는 단순 INSERT보단 COPY를 사용하는 것이 가장 효율적이란 것을 알게 되었다. psycopg2 bulk insert 여러 방법의 성능 비교 글

    query = "COPY app (app_id, name) FROM STDIN"
    with cursor.copy(query) as copy:
        for app in get_applist():
            if app[1]:
                copy.write_row(app)

COPY는 파일을 받아오지만 여기서는 표준 입력을 통해 데이터를 전달해주었다. 파일을 사용하여 한 번에넘기면 copy가 기본적으로 insert보다 빠를 뿐만 아니라 db와의 연결을 여러 번 호출할 때 드는 통신 오버헤드가 줄기 때문에 더욱 효율적이다.

여기서 cursor는 psycopg3의 psycopg.Cursor 객체이다.
psycopg를 검색하면 자주 나오는 구버전의 psycopg2의 executor.cursor에서는 copy 메소드를 지원하지 않는다. 그렇다고 psycopg2가 copy문을 지원하지 않는 것은 아니다.

profile
Data Engineer

0개의 댓글