CTE模式,默认会把子查询数据物化到内存中吗,还是写到磁盘上

【 TiDB 使用环境】生产环境
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
使用with 关键字的CTE模式,默认会把子查询数据物化到内存中吗,还是写到磁盘上
下面table_a 是在内存中还是在磁盘上呢?

with table_a as (
select * from table_b
)
select user_id,count(1) from table_a group by user_id

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

内存中吧,你执行看看内存是不是增长很快

CTE的数据默认是物化到内存中,至于table_a在给定的SQL查询中是存储在内存中还是磁盘上,这取决于具体的实现和数据量。一般来说,CTE的结果集是临时的,通常会在内存中处理,但如果数据量较大或者内存不足,数据库系统可能会将部分数据写入磁盘以进行处理。

https://docs.pingcap.com/zh/tidb/stable/dev-guide-use-common-table-expression#公共表表达式-cte

在这个 SQL 语句,定义了三个 CTE 块,CTE 块之间使用 , 进行分隔。

先在 CTE 块 books_authored_by_rm 当中将该作者(作者 ID 为 2299112019)所编写的书查出来,然后在 books_with_average_ratingsbooks_with_orders 中分别查出这些书的平均评分和订单数,最后通过 JOIN 语句进行汇总。

值得注意的是,books_authored_by_rm 中的查询只会执行一次,TiDB 会开辟一块临时空间对查询的结果进行缓存,当 books_with_average_ratingsbooks_with_orders 引用时会直接从该临时空间当中获取数据。

默认是写在内存中的,不过要写磁盘也不是不行,触发落盘就会写磁盘了。

https://docs.pingcap.com/zh/tidb/stable/configure-memory-usage#数据落盘

默认内存中,内存不够了就落盘

如果CTE的结果集不大,通常会被物化到内存中以提高性能。
但是,如果结果集非常大,超过了可用内存,CTE的结果可能会被写到磁盘上的临时文件。

如果结果集较小且系统有足够的内存,TiDB 会尽量将其保持在内存中。对于较大的结果集,如果内存不足,可能会写入磁盘进行处理。