根据此链接,要在 postgresql 扩展中执行并行操作,多线程不是一个选项。
那么还有其他方法吗?比如一些关于多进程的API和用法?也许让我知道在哪里可以找到示例代码?
或者在 Postgresql 扩展中执行并行操作的期望本身根本不合理?您能提供一些解释吗?
更新:关于我想要并行化的东西,它通常与Postgresql无关,而是计算一堆数据的哈希值
根据此链接,要在 postgresql 扩展中执行并行操作,多线程不是一个选项。
那么还有其他方法吗?比如一些关于多进程的API和用法?也许让我知道在哪里可以找到示例代码?
或者在 Postgresql 扩展中执行并行操作的期望本身根本不合理?您能提供一些解释吗?
更新:关于我想要并行化的东西,它通常与Postgresql无关,而是计算一堆数据的哈希值
我想提高 Postgresql 扩展的性能,当然也考虑多线程。虽然粗略地,我知道到目前为止Postgresql是基于多进程的,并且在扩展中,Postgresql使用了诸如SRF_FIRSTCALL_INIT()、SRF_PERCALL_SETUP、MemoryContextSwitchTo()、CreateTemplateTupleDesc()、palloc()、Int64GetDatum等的东西,所以我的问题:
我知道 PostgreSQL 数据文件存在“撕裂写入”(aka,“部分写入”)问题,为了防止这种情况,采用了 FPW(整页写入)机制。
那么 WAL 段文件是否也存在某种“部分写入”问题?如果是这样,是否有任何机制来阻止它?如果没有预防,这意味着提交的事务会在“WAL 段文件部分写入”时丢失?
其实我也有关于FPW的疑问。让我们基于通常的现代 Linux,检查点通常采用“同步”模式,对吗?如果是这样,8K 写入只会返回两个 4K OS 页面写入的成功,对吗?如果是这样,“部分写入”怎么可能发生?请纠正我的理解。
提前致谢!
更新:
jjanes 回答我说:
WAL 页面上的部分写入在读回时会使校验和失败,因此将被解释为刚好超出 WAL 的末尾。因此,不会重播任何部分记录。
我想我可以理解这一点,但这不会导致任何数据丢失吗?特别是 WAL 部分写入发生在已提交的事务上,然后重新启动重放,这可能吗,尽管很少见?