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

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

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

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

听起来您可能希望使用服务器编程接口(SPI)将存储过程实现为在PostgreSQL后端内运行的C语言函数 。

使用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语言函数和扩展SQL 。

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