postgresql - 向表中插入数据的最快方法

标签 postgresql insert

我有一个 Postgres 数据库,我已经向表中插入了一些数据。由于 Internet 连接问题,部分数据无法写入。我尝试写入数据库的文件很大(大约 330712484 行 - 即使是 ws -l 命令也需要需要一段时间才能完成。

现在,row_id 列是(整数)主键,并且已经编入索引。由于某些行无法插入到表中,因此我想将这些特定行插入到表中。 (我估计只有大约 1.8% 的数据没有插入到表中……)一开始,我试着查看主键是否在数据库中,如下所示:

conn      = psycopg2.connect(connector)
cur       = conn.cursor()

with open(fileName) as f:

    header = f.readline().strip()
    header = list(csv.reader([header]))[0]
    print(header)
    for i, l in enumerate(f):
        if i>10: break
        print(l.strip())

        row_id = l.split(',')[0]

        query = 'select * from raw_data.chartevents where row_id={}'.format(row_id)
        cur.execute(query)
        print(cur.fetchall())

cur.close()
conn.close()

即使对于前几行数据,检查主键是否存在也需要花费大量时间。

最快的方法是什么?

最佳答案

在 PostgreSQL 中插入数据最快的方法是使用 COPY 协议(protocol),它在 psycopg2 中实现。 COPY 不允许您检查目标 ID 是否已经存在。最好的选择是将文件内容复制到临时表中,然后从中插入或更新,如 Batch Update我在 http://tapoueh.org 上写的文章不久前的博客。

您可以使用足够新的 PostgreSQL 版本

INSERT INTO ...
SELECT * FROM copy_target_table
    ON CONFICT (pkey_name) DO NOTHING

关于postgresql - 向表中插入数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45689379/

相关文章:

sql - 带有时区顺序的 OSX postgres 9.1.4 时间戳

postgresql - 连接表上的索引

javascript - 我无法将数据插入 Sequelize 中的表中(特别是外键)

MySQL手动插入多个固定长度的值

mysql - 同一行的约束

MySQL 查询插入默认数据而不是输入数据

python - psycopg2、Redshift 和 unittest 的并发问题

postgresql - OpenLayers 中的矢量投影

jquery - MySQL查询仅当两个字段不存在时才插入数据

mysql - 如何在mysql存储过程中使用insertignore