COPY是如何工作的,为什么它比INSERT要快得多?

11 浏览
0 Comments

COPY是如何工作的,为什么它比INSERT要快得多?

今天,我花了一整天的时间来改进我的Python脚本,将数据推送到我的Postgres数据库中。以前,我是这样插入记录的:

query = "INSERT INTO my_table (a,b,c ... ) VALUES (%s, %s, %s ...)";
for d in data:
    cursor.execute(query, d)

然后,我重写了我的脚本,使用内存文件来创建Postgres的COPY命令,这样我可以将数据从文件复制到我的表中:

f = StringIO(my_tsv_string)
cursor.copy_expert("COPY my_table FROM STDIN WITH CSV DELIMITER AS E'\t' ENCODING 'utf-8' QUOTE E'\b' NULL ''", f)

COPY方法的速度提升非常惊人。

METHOD      | TIME (secs)   | # RECORDS
=======================================
COPY_FROM   | 92.998    | 48339
INSERT      | 1011.931  | 48377

但是我找不到任何关于为什么这样的信息。它与多行INSERT有何不同,以至于速度如此之快?

还可以参考这个基准测试

# original
0.008857011795043945: query_builder_insert
0.0029380321502685547: copy_from_insert
#  10 records
0.00867605209350586: query_builder_insert
0.003248929977416992: copy_from_insert
# 10k records
0.041108131408691406: query_builder_insert
0.010066032409667969: copy_from_insert
# 1M records
3.464181900024414: query_builder_insert
0.47070908546447754: copy_from_insert
# 10M records
38.96936798095703: query_builder_insert
5.955034017562866: copy_from_insert

0