大飞飞呀
1
【 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) 截图此页面
【附件:截图/日志/监控】
呢莫不爱吃鱼
3
CTE的数据默认是物化到内存中,至于table_a
在给定的SQL查询中是存储在内存中还是磁盘上,这取决于具体的实现和数据量。一般来说,CTE的结果集是临时的,通常会在内存中处理,但如果数据量较大或者内存不足,数据库系统可能会将部分数据写入磁盘以进行处理。
有猫万事足
4
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_ratings
和 books_with_orders
中分别查出这些书的平均评分和订单数,最后通过 JOIN
语句进行汇总。
值得注意的是,books_authored_by_rm
中的查询只会执行一次,TiDB 会开辟一块临时空间对查询的结果进行缓存,当 books_with_average_ratings
和 books_with_orders
引用时会直接从该临时空间当中获取数据。
默认是写在内存中的,不过要写磁盘也不是不行,触发落盘就会写磁盘了。
https://docs.pingcap.com/zh/tidb/stable/configure-memory-usage#数据落盘
如果CTE的结果集不大,通常会被物化到内存中以提高性能。
但是,如果结果集非常大,超过了可用内存,CTE的结果可能会被写到磁盘上的临时文件。
哈喽沃德
7
如果结果集较小且系统有足够的内存,TiDB 会尽量将其保持在内存中。对于较大的结果集,如果内存不足,可能会写入磁盘进行处理。