某些SQL语句在中间结果中会显得太大,并且无法存储内存。它需要解决到外部内存(例如,大型数据卷和其他操作的存在,导致聚合操作的中间结果集。),以及设置生成的临时数据文件太多了,它将影响业务的正常数据编写,无法执行它。磁盘只能提供仅读取操作。
对于上述情况,可以通过两种方法来控制两种方法来控制用户执行过程的中间结果的数量。超过限制时,将报告错误以终止语句的执行,以防止临时数据文件太多空间:
1.方案1:设置每个线程临时文件的数据数量限制
2.方案2:设置用户设置用户空间限制的中间结果
设置GUC参数temp_file_limit以限制每个线程的临时文件登录磁盘的数据限制。TEMP_FILE_LIMIT属于SUSET类型参数,带有一个值范围:Integer,单位为KB.-1表示没有限制。值:-1。
1.如何设置temp_file_limit参数
全局设置可以通过GS_GUC工具执行,如下所示:
gs_guc reload -z协调器-z datanode -n all -c“ temp_file_limit = 1024”“”“”
2. temp_file_limit值计算公式
您可以使用以下公式大致计算temp_file_limit的值:temp_file_limit =预期的总较低卷/同时的下线线程数
总体磁盘的总量通常可以设置为可用空间的20%。可以根据用户的接受来调整此百分比。在同一时间,下磁盘中的线程数是在业务操作问题中查询中查询中的中间临时数据中的线程数。随着数据库中存储的数据数量的增加,应及时调整temp_file_limit的值。
注意:此参数是限制每个线程的临时文件的数据量。如果查询具有多个线程,则单个线程跌落的数据量量超过此参数限制,并且查询将报告带有错误的错误。如果每个线程不超过限制,那么多线程下的数据量超过了此参数的限制将不会退出错误。
3.示例
以TPC-DS1X数据中的customer_demographics表为示例。无法按下SQL查询,中间结果集仅在CN上
1.如何设置用户的中间结果以设置空间限制
有两种方法可以设置用户设置空间限制的中间结果:
创建user_name ... SpillSpace'SpillSpacelimit';
Alter user_name ... SpillSpace'SpillSpacelimit';
例如:创建用户U1密码“ ABCD@1234”溢出空间'无限';
更改U1溢出空间'1G';- 修改用户U1的中间结果集
阐明:
注意:
要进行上述设置,您需要将GUC参数enable_perm_space设置为ON。
如果多个用户将执行大量的中间结果,则需要设置每个用户。
2.示例
示例1:中间结果集将落在CN和DN上,数据总数将超过1G
示例2:无法按下SQL查询,中间结果集仅在CN上
第一个方案的重点是限制每个线程的临时文档的数量。第二个解决方案着重于限制用户的临时文档卷。该业务的目的应与文档下的业务目的量相结合,影响正常业务的执行。
本文分享了华为云社区的GaussDB(DWS)的GaussDB(DWS)。作者:Wangxiaojuan8。