我的目标是实现可用于将数据块从数据库复制到C函数中的最高性能,以便作为查询结果进行处理和返回。
我是PostgreSQL的新手,我目前正在研究移动数据的可能方法。具体来说,我正在寻找与PostgreSQL相关的细微差别或关键词来快速移动大数据。
注意: 我的最终目标是速度,所以我愿意接受我提出的确切问题之外的答案,只要它获得了很大的性能结果。例如,我遇到了COPY关键字(仅限PostgreSQL),它可以快速地将数据从表格移动到文件中;反之亦然。我试图远离数据库外部的处理,但如果它提供的性能改进超出了外部处理的明显缺点,那就这样吧。
答案 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 functions和extending SQL。
如果感兴趣的是最高速度,您的客户端可能希望通过libpqtypes使用libpq二进制协议,以便它以最小的开销接收服务器端SPI使用过程产生的数据。