关于KingbaseES临时文件过大问题

背景

前几天碰到一个问题,现场并发很高,数据量很大(6T),主备库经常出现临时文件过多。

临时文件概念:

当私有进程buffer不够用时,会将buffer内容dump到tempfile供数据库正常sql使用。常见的几个功能场景:ExecSorts、ExecHashJoin、ExecMergejoin、tempTable、CTE等,当work_mem或者是temp_buffers不足以容纳sql中间功能环节结果集时会产生tempfile。

通过work_mem可以设置会话Query使用的临时内存的阈值,当然一个Query中如果使用了大量并行的排序等操作时,或者使用了并行计算多个WORKER PROCESS时,可能用到多个WORK_MEM空间,那么内存的使用量会比较大。

注意,临时表与Query执行过程中使用的临时文件概念不同,包括我们后面提到的几个临时文件使用跟踪的参数,实际上跟踪的都是Query执行过程中产生的临时文件,而不是临时表。请注意。

在控制临时文件使用量,使用个数的参数上,控制的也是Query执行过程中产生的临时文件,并不会控制临时表使用多少文件。

Query使用临时文件相关

限制一条个backend process最多能使用多少临时空间,通常临时空间在事务结束、Query结束后会自动回收。

包括数据库启动时,也会自动清理临时文件。

#temp_file_limit = -1                   # limits per-process temp file space  
                                        # in kB, or -1 for no limit

1、temp_file_limit (integer)

指定进程可用于临时文件的最大磁盘空间量,例如排序和哈希临时文件,或用于保留光标的存储文件。试图超过此限制的交易将被取消。该值以KB为单位指定,而-1(默认值)表示没有限制。只有超级用户可以更改此设置。

此设置限制给定Kingbase进程使用的所有临时文件在任何时刻使用的总空间。应该注意的是,用于显式临时表的磁盘空间,与查询执行中后台使用的临时文件不同,不计入此限制。

这个参数作用可以避免操作系统磁盘空间被临时文件占用过多。

当临时文件使用量大于设置阈值时,记录日志。

#log_temp_files = -1                    # log temporary files equal or larger  
                                        # than the specified size in kilobytes;  
                                        # -1 disables, 0 logs all temp files

2、log_temp_files (integer)

控制临时文件名和大小的日志记录。可以为排序、哈希和临时查询结果创建临时文件。删除每个临时文件时,会为其创建一个日志条目。值为零记录所有临时文件信息,而正值仅记录大小大于或等于指定KB数的文件。默认设置为-1,这将禁用此类日志记录。只有超级用户可以更改此设置。

例如,把log_temp_files设置成0 ,就会针对需要到临时空间的sql记录日志。

3、work_mem (integer)

指定内部排序操作和哈希表在写入临时磁盘文件之前要使用的内存量。该值默认为4MB。请注意,对于复杂的查询,可能会并行运行多个排序或哈希操作;在开始将数据写入临时文件之前,将允许每个操作使用此值指定的内存量。此外,几个正在运行的会话可以同时执行此类操作。因此,使用的总内存可能是work_mem值的许多倍;在选择值时,有必要牢记这一事实。排序操作用于ORDER BY、DISTINCT和merge联接。哈希表用于哈希联接、基于哈希的聚合和子查询中基于哈希的处理。

最后需要说明,虽然增大work_mem可以避免过多临时文件,但是如果查询并发过大有可能造成内存溢出的严重后果。

相关参数

临时表相关

前面提到临时表和Query使用临时文件不相干。

#temp_buffers = 8MB                     # min 800kB

1、temp_buffers (integer)

设置每个数据库会话使用的最大临时缓冲区数。这些是会话本地缓冲区,仅用于访问临时表。默认值为8MB。设置可以在单个会话中更改,但只能在会话中首次使用临时表之前更改;随后更改该值的尝试将不会对该会话产生影响。

会话将根据需要分配临时缓冲区,直至达到temp_buffers缓冲区给定的限制。在实际上不需要许多临时缓冲区的会话中设置一个大值的成本仅为一个缓冲区描述符,即temp_buffers缓冲区中的每一增量约64个字节。但是,如果实际使用了缓冲区,则会为其消耗额外的8192字节(或者通常为BLCKSZ字节)。

#temp_tablespaces = ''                  # a list of tablespace names, '' uses  
                                        # only default tablespace

总结

当进行一些Query的操作,使用的内存量大于work_mem指定阈值时,就会触发使用临时文件。包括排序,IDSTINCT,MERGE JOIN,HASH JOIN,哈希聚合,分组聚合,SRF,递归查询 等操作。

通过设置 log_temp_files ,当会话使用临时文件大小超过了设置大小,就可以跟踪到临时文件的使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值