pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
服务器在内存上下文中分配内存,使得在一个上下文中做出的分配可以通过 销毁该上下文来释放,而不影响在其他上下文中做出的分配。所有分配(通过 palloc 等)都是在被选为当前上下文的那个上下文中 进行的。如果试图释放(或重新分配)不是在当前上下文中分配的内存,将会 得到不可预知的结果。
内存上下文的创建和切换属于 SPI 管理器内存管理的内容。
SPI 过程涉及两个内存上下文:上层执行器内存上下文和过程内存上下文 (如果已连接)。
在过程连接到 SPI 管理器之前,当前内存上下文是上层执行器上下文, 因此该过程自身在连接到 SPI 之前通过 palloc/repalloc 或由 SPI 辅助函数所做的所有分配都位于这个上下文中。
调用 SPI_connect 之后,当前上下文是过程的私有 上下文。通过 palloc/repalloc 或由 SPI 辅助函数所做的所有分配(SPI_copytuple、 SPI_modifytuple、 SPI_palloc 和 SPI_repalloc 除外)都位于这个上下文中。
当过程(通过 SPI_finish)与 SPI 管理器断开连接时, 当前上下文会恢复为上层执行器上下文,而在该过程内存上下文中分配的 所有内存都会被释放,不能再使用!
如果想把某些东西返回给上层执行器,就必须在上层上下文中为它分配 内存!
SPI 无法自动释放上层执行器上下文中的分配!
查询执行期间分配的内存会在该查询完成时被 SPI 自动释放!
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。