Postgresql 带Postgres的快速数组插入

Postgresql 带Postgres的快速数组插入,postgresql,Postgresql,在Oracle OCI和OCCI中,有用于执行数组插入的API功能,您可以在客户机中构建一个值数组,并将该数组连同一条准备好的语句发送到服务器,以便在一次操作中将数千个条目插入到表中,从而在某些情况下大大提高了性能。PostgreSQL中有类似的东西吗 我使用的是股票PostgreSQL C API 一些伪代码来说明我的想法: stmt = con->prepare("INSERT INTO mytable VALUES ($1, $2, $3)"); pg_c_api_array arr

在Oracle OCI和OCCI中,有用于执行数组插入的API功能,您可以在客户机中构建一个值数组,并将该数组连同一条准备好的语句发送到服务器,以便在一次操作中将数千个条目插入到表中,从而在某些情况下大大提高了性能。PostgreSQL中有类似的东西吗

我使用的是股票PostgreSQL C API

一些伪代码来说明我的想法:

stmt = con->prepare("INSERT INTO mytable VALUES ($1, $2, $3)");
pg_c_api_array arr(stmt);
for triplet(a, b, c) in mylongarray:
    pg_c_api_variant var = arr.add();
    var.bind(1, a);
    var.bind(2, b);
    var.bind(3, c);
stmt->bindarray(arr);
stmt->exec()

PostgreSQL具有类似的功能—语句复制和复制API—速度非常快


正如Pavel Stehule所指出的,有COPY命令,并且在C中使用libpq时,有用于传输复制数据的相关函数。我没用过这些。我主要使用Python编写针对PostgreSQL的程序,并使用了psycopg2中类似的功能。这非常简单:

conn = psycopg2.connect(CONN_STR)
cursor = conn.cursor()
f = open('data.tsv')
cusor.copy_from(f, 'incoming')
f.close()

事实上,我经常用一个类似文件的包装器对象替换
open
,该对象首先执行一些基本数据清理。它非常无缝。

我喜欢这种在一个命令中创建数千行的方式:

INSERT INTO mytable VALUES (UNNEST($1), UNNEST($2), UNNEST($3));
将第1列的值数组绑定到
$1
,将第2列的值数组绑定到
$2
等等。!当您习惯于按行思考时,在列中提供值起初可能看起来有点奇怪


您需要PostgreSQL>=8.4才能运行
unest
或您自己的函数来将数组转换为集合。

您使用的是什么语言/PostgreSQL客户端API?这就决定了哪些功能可以轻松使用。遗憾的是,需要先将数据放入文件中。在我的例子中,我收到一个编码文件,对文件中的值进行解码,并希望直接从内存中插入它们。将它们放回一个新的(PostgreSQL复制编码)文件似乎很不幸。不,您可以将复制与流一起使用,也可以直接与字符串中的数据行一起使用。它不必是字符串。也可以传递二进制数据:那么数据是否总是由制表符分隔的值行组成?我认为如果一列是varchar,那么必须用引号括起来,或者调用PQ escape函数?您可以使用任何类似字符的分隔符,tab是默认分隔符-请参阅复制文档
INSERT INTO mytable VALUES (UNNEST($1), UNNEST($2), UNNEST($3));