首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CTE的生命中,记忆中有什么?

在CTE的生命中,记忆中有什么?
EN

Database Administration用户
提问于 2015-02-05 03:59:46
回答 1查看 1.4K关注 0票数 1

假设一个多读/多写CTE,在语句的生命周期中,记忆中到底有什么?

RETURNING数据外,所有数据是否都在每个子语句的末尾丢弃?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2015-02-06 06:53:12

将CTE项的输出累加到TupleStore中。TupleStore可能在内存中,也可能溢出到磁盘中.请参阅src/include/utils/tuplestore.hsrc/backend/utils/sort/tuplestore.c,特别是tuplestore.c顶部的评论。

对于wCTE,这将是该术语的RETURNING输出。

要确定是否保留任何其他内容,需要分析执行每个CTE项的内存上下文,因为PostgreSQL使用基于分层内存上下文的分配器。在这里,您需要查看src/backend/executor/nodeCtescan.c。这是相当复杂的,但是读到CteScanNext表明查询通常是并发执行的,其中一个查询使用另一个查询的结果。

所以。虽然内存可能在每个子语句(CTE术语)的末尾被释放,但没有任何CTE术语在任何特定时间完成的保证。

改写你的问题:

是来自CTE项的所有内存中数据,但在下一个CTE项执行之前丢弃的RETURNING数据除外。

答案是“不”。

然而,这并不意味着PostgreSQL会将大量数据保存在内存中。一旦处理完行,就经常丢弃行,再也不需要再看到它们了。它可能会将大的临时结果泄漏到磁盘上的诱饵文件。如果它是物化、排序或aggegate查询输出,它通常会在完成后丢弃未聚合/未排序的数据。等。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/91136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档