在使用C函数扩展PostgreSQL时实现高性能事务

时间:2012-11-05 16:57:02

标签: c postgresql

我的目标是实现可用于将数据块从数据库复制到C函数中的最高性能,以便作为查询结果进行处理和返回。

我是PostgreSQL的新手,我目前正在研究移动数据的可能方法。具体来说,我正在寻找与PostgreSQL相关的细微差别或关键词来快速移动大数据。

注意: 我的最终目标是速度,所以我愿意接受我提出的确切问题之外的答案,只要它获得了很大的性能结果。例如,我遇到了COPY关键字(仅限PostgreSQL),它可以快速地将数据从表格移动到文件中;反之亦然。我试图远离数据库外部的处理,但如果它提供的性能改进超出了外部处理的明显缺点,那就这样吧。

1 个答案:

答案 0 :(得分:4)

听起来您可能希望使用server programming interface (SPI)将存储过程实现为在PostgreSQL后端内运行的C language function

使用SPI_connect设置SPI。

现在SPI_prepare_cursor查询,然后SPI_cursor_open。完成后SPI_cursor_fetch行和SPI_cursor_close行。请注意,SPI_cursor_fetch允许您获取批量行。

SPI_finish完成后清理。

您可以在生成结果行时将结果行返回到tuplestore,从而无需在内存中构建整个表。请参阅PostgreSQL源代码中任何set-returns函数中的示例。您可能还想查看SPI_returntuple辅助函数。

另请参阅:C language functionsextending SQL

如果感兴趣的是最高速度,您的客户端可能希望通过libpqtypes使用libpq二进制协议,以便它以最小的开销接收服务器端SPI使用过程产生的数据。