假设一个多读/多写CTE,在语句的生命周期中,记忆中到底有什么?
除RETURNING数据外,所有数据是否都在每个子语句的末尾丢弃?
发布于 2015-02-06 06:53:12
将CTE项的输出累加到TupleStore中。TupleStore可能在内存中,也可能溢出到磁盘中.请参阅src/include/utils/tuplestore.h和src/backend/utils/sort/tuplestore.c,特别是tuplestore.c顶部的评论。
对于wCTE,这将是该术语的RETURNING输出。
要确定是否保留任何其他内容,需要分析执行每个CTE项的内存上下文,因为PostgreSQL使用基于分层内存上下文的分配器。在这里,您需要查看src/backend/executor/nodeCtescan.c。这是相当复杂的,但是读到CteScanNext表明查询通常是并发执行的,其中一个查询使用另一个查询的结果。
所以。虽然内存可能在每个子语句(CTE术语)的末尾被释放,但没有任何CTE术语在任何特定时间完成的保证。
改写你的问题:
是来自CTE项的所有内存中数据,但在下一个CTE项执行之前丢弃的
RETURNING数据除外。
答案是“不”。
然而,这并不意味着PostgreSQL会将大量数据保存在内存中。一旦处理完行,就经常丢弃行,再也不需要再看到它们了。它可能会将大的临时结果泄漏到磁盘上的诱饵文件。如果它是物化、排序或aggegate查询输出,它通常会在完成后丢弃未聚合/未排序的数据。等。
https://dba.stackexchange.com/questions/91136
复制相似问题