
# 内存
介绍与内存相关的参数设置。
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/notice_3.0-zh-cn.png)
本节涉及的参数仅在数据库服务重新启动后生效。
 #### max_process_memory
**参数说明：**设置一个数据库节点可用的最大物理内存。
**参数类型：**SIGHUP
**取值范围**：整型，2\*1024\*1024～INT_MAX/2，单位为KB。
**默认值：**非从备DN节点自动适配，一个机器部署多个DN情况下，公式为（物理内存大小）\* 0.8 / (1+主DN个数)；一个机器部署单个DN情况下，公式为（物理内存大小）\* 0.6；当结果不足2GB时，默认取2GB。从备DN默认为12GB。
**设置建议：**
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/caution_3.0-zh-cn.png)
单机部署的场景仅适用于存量用户。
- DN上该数值需要根据系统物理内存及单节点部署主DN个数决定。 一个机器部署多个DN情况下，max_process_memory计算公式如下：（物理内存大小 -- vm.min_free_kbytes）\* 0.8 / (n+主DN个数)；一个机器部署单个DN情况下，max_process_memory计算公式如下：（物理内存大小 -- vm.min_free_kbytes）\* 0.6。
  该参数目的是尽可能保证系统的可靠性，不会因数据库内存膨胀导致节点OOM。这个公式中提到vm.min_free_kbytes，其含义是预留操作系统内存供内核使用，通常用作操作系统内核中通信收发内存分配，至少为5%内存。即， max_process_memory=物理内存\*0.8/(n+主DN个数)，其中，当集群规模小于256时， n=1；当集群规模大于256且小于512时， n=2；当集群规模超过512时，n=3。
  
- 不推荐设置为最小阈值。
- CN上该数值内存可设置与DN数值一样。
- RAM：集群规划时分配给集群的最大使用内存。
- DWS从8.2.0版本开始，为了提升内存资源利用率，增大了单机器单DN部署形态的max_process_memory初始值，但当出现集群状态不均衡的情况下，两个主DN节点会同时在一个机器上，如果仍然使用max_process_memory初始值，机器可能出现OOM报错的情况。为此，8.2.0版本开始，max_process_memory参数更改为SIGHUP类型，可以通过手动设置的方式来动态调整；同时，新增max_process_memory_auto_adjust参数，当出现集群状态不均衡的情况下，CM会根据集群状态来动态调整max_process_memory，调整max_process_memory的计算公式为：（物理内存大小 -- vm.min_free_kbytes）\* 0.8 / 主DN个数。
- DWS从8.2.1版本开始，扩大了max_process_memory动态内存调整的适用范围，由原先仅支持一个机器部署单个DN的集群形态，变更为支持所有部署形态。
  - max_process_memory_auto_adjust为on时，max_process_memory将会在上限和下限两值之间动态调整；其中，max_process_memory下限值的计算公式为：（物理内存大小）\* 0.8 / (1+主DN个数)；max_process_memory上限值由GUC参数max_process_memory_balanced设置（max_process_memory_balanced参数设置请联系技术支持工程师）。
  
  - 集群在均衡模式下，max_process_memory将使用上限值，提高节点整体的内存资源利用率，相对之前版本，内存利用率会提升。
  
  - 集群在非均衡模式下，max_process_memory将使用下限值，节点整体的内存资源利用率和8.2.1集群之前的版本一致。
  
  - 升级场景下，该参数为保持前向兼容，系统不会设置max_process_memory_balanced，max_process_memory默认使用升级前设置的值。
   
 
#### max_process_memory_auto_adjust
**参数说明：**设置是否开启max_process_memory参数的自动调整功能（该参数仅8.2.0及以上集群版本支持）。
**参数类型：**SIGHUP
**取值范围：**布尔型
**默认值：**on
 #### shared_buffers
**参数说明：**设置DWS使用的共享内存大小。增加此参数值会使DWS比系统默认设置需要更多的System V共享内存。
**参数类型：**POSTMASTER
**取值范围：**整型，128～INT_MAX，单位为8KB。
改变BLCKSZ的值会改变最小值。
**默认值：**CN节点为DN节点值的1/2，DN节点取公式计算：POWER(2,ROUND(LOG(2,max_process_memory/18),0))。如果操作系统支持的共享内存小于32MB，则在初始化数据存储区时会自动调整为操作系统支持的最大值。
**设置建议：**
由于DWS大部分查询下推，建议DN中此参数设置比CN大。
建议设置shared_buffers值为内存的40%以内。行存列存分开对待。行存设大，列存设小。列存：(单服务器内存/单服务器DN个数)\*0.4\*0.25。
如果设置较大的shared_buffers需要同时增加checkpoint_segments的值，因为写入大量新增、修改数据需要消耗更多的时间周期。
#### bulk_write_ring_size
**参数说明：**数据并行导入使用的环形缓冲区大小。
**参数类型：**USERSET
**取值范围：**整型，16384～INT_MAX，单位为KB。
**默认值：**2GB
**设置建议：**建议导入压力大的场景中增加DN中此参数配置。
#### buffer_ring_ratio
参数说明：设置并行导出时使用环形缓冲区的阈值大小。
**参数类型：**USERSET
**取值范围：**整型，1～1000
**默认值：**250
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
- 默认值表示阈值为shared_buffers的250/1000即1/4。
- 最小为shared_buffers的1/1000。
- 最大为shared_buffers的大小。
 
**设置建议：**导出时出现缓存命中率不符合预期的场景建议在DN中设置此参数。
#### enable_cstore_ring_buffer
**参数说明：**设置列存RingBuffer的开关，该参数仅8.2.0及以上集群版本支持。
**参数类型：**USERSET
**取值范围：**布尔型
**默认值：**off
**设置建议：**建议在业务运行一段时间，当CStoreBuffer内已存入大量高频查询的数据后，进行低频大表查询前打开，查询完大表后关闭。
#### temp_buffers
**参数说明：**设置每个数据库会话使用的LOCAL临时缓冲区的大小。
**参数类型：**USERSET
**取值范围：**整型，800\~INT_MAX/2，单位为8KB。
**默认值：**8MB
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
- 在每个会话的第一次使用临时表之前可以改变temp_buffers的值，之后的设置将是无效的。
- 一个会话将按照temp_buffers给出的限制，根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值，其开销只是一个缓冲区描述符的大小。当缓冲区被使用，就会额外消耗8192字节。
 
 #### max_prepared_transactions
**参数说明：**设置可以同时处于"预备"状态的事务的最大数目。增加此参数的值会使DWS比系统默认设置需要更多的System V共享内存。
**参数类型：**POSTMASTER
**取值范围：**整型，0\~536870911。CN取值为0表示关闭预备事务的特性。
**默认值：**800
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/caution_3.0-zh-cn.png)
- 当DWS部署为主备双机时，必须确保备机上此参数的设置值大于或等于主机上的设置值，否则无法在备机上进行查询操作。
- 为避免在准备步骤失败，此参数的值不建议小于[max_connections](https://support.huaweicloud.com/devg-911-dws/dws_04_0889.html#ZH-CN_TOPIC_0000002202095225__s2d671f584b5647a19255e7c6a3d116aa)。
 
 #### work_mem
**参数说明：**设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY，DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。
对于复杂的查询，可能会同时并发运行好几个排序或者散列操作，每个都可以使用此参数所声明的内存量，不足时会使用临时文件。同样，好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work_mem的好几倍。
**参数类型：**USERSET
**取值范围：**整型，64\~INT_MAX，单位为KB。
**默认值：** 小规格内存为512MB， 大规格内存为2GB（[max_process_memory]大于等于30GB为大规格内存，否则为小规格内存）。
**设置建议：**
依据查询特点和并发来确定，一旦work_mem限定的物理内存不够，算子运算数据将写入临时表空间，带来5-10倍的性能下降，查询响应时间从秒级下降到分钟级。
- 对于串行无并发的复杂查询场景，平均每个查询有5-10关联操作，建议work_mem=50%内存/10。
- 对于串行无并发的简单查询场景，平均每个查询有2-5个关联操作，建议work_mem=50%内存/5。
- 对于并发场景，建议work_mem=串行下的work_mem/物理并发数。
  ![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/notice_3.0-zh-cn.png)
  开启内存自适应后，收集统计信息后不再需要使用work_mem进行算子内存使用调优，由系统根据当前负载情况，为每个语句生成计划，并估算每个算子的内存使用量和整个语句的内存使用量。系统根据负载情况和整个语句内存使用量进行队列调度，所以多并发场景会出现语句排队的情况。
  
 
#### query_mem
**参数说明：**设置执行作业所使用的内存。如果设置的query_mem值大于0，在生成执行计划时，优化器会将作业的估算内存调整为该值。
**参数类型：**USERSET
**取值范围：**整型，0，或大于32MB的整型，默认单位为KB。如果设置值小于32MB，系统会自动将该参数设置为默认值0，此时优化器不会根据该值调整作业的估算内存。
**默认值：**0
#### query_max_mem
**参数说明：**设置执行作业所能够使用的最大内存。如果设置的query_max_mem值大于0，在生成执行计划时，优化器会根据该值来设置算子的可用内存。当作业执行时所使用内存超过该值时，将报错退出。
**参数类型：**USERSET
**取值范围：**整型，0，或大于32MB的整型，单位为KB。如果设置值为小于32MB，系统会自动将该参数设置为默认值0，此时优化器不会根据该值限制作业的内存使用。
**默认值：**0
#### agg_max_mem
**参数说明：**设置执行作业中的Agg算子的聚集列超过5列时，该Agg算子所能够使用的最大内存。当agg_max_mem大于0时生效。（该参数仅8.1.3.200及以上集群版本支持）
**参数类型：**USERSET
**取值范围：**整型，0，或大于32MB的整型，单位为KB。如果设置值小于32MB，系统会自动将该参数设置为默认值0，此时不会根据该值限制Agg算子的内存使用。
**默认值：**
- 若当前集群为低版本升级到8.1.3及以上版本，继承升级前参数，默认值为INT_MAX。
- 若当前集群为新装的8.1.3及以上版本，默认值为2GB。
 
#### enable_rowagg_memory_control
**参数说明：**控制行存agg算子内存使用上限。
**参数类型：**USERSET
**取值范围：**布尔型
- on表示开启控制行存agg算子内存使用限制。设置为on可避免行存agg内存过度使用导致系统内存不可用，但可能导致agg性能劣化。
- off表示关闭控制行存agg算子内存使用限制。设置为off可能导致系统内存不可用。
**默认值：**on
 #### maintenance_work_mem
**参数说明：**设置在维护性操作（比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等）中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。
**参数类型：**USERSET
**取值范围：**整型，1024\~INT_MAX，单位为KB。
**默认值：** 小规格内存为512MB， 大规格内存为2GB（[max_process_memory]大于等于30GB为大规格内存，否则为小规格内存）。
**设置建议：**
- 建议设置此参数的值等于[work_mem]，可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里，任意时刻只有一个维护性操作可以执行，并且在执行维护性操作时不会有太多的会话。
- 当[自动清理](https://support.huaweicloud.com/devg-911-dws/dws_04_0923.html)进程运行时，[autovacuum_max_workers](https://support.huaweicloud.com/devg-911-dws/dws_04_0923.html#ZH-CN_TOPIC_0000002202095169__s502d4304994d4da5bd3cda661aab27ac)倍数的内存将会被分配，所以此时设置maintenance_work_mem的值应该不小于[work_mem]。
- 如果进行大数据量的cluster等，可以在session中调大该值。
 
#### psort_work_mem
**参数说明：**设置列存表在进行局部排序中在开始写入临时磁盘文件之前使用的内存大小。带partial cluster key的表、带索引的表插入，创建表索引，删除表和更新表都会用到。
**参数类型：**USERSET
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/notice_3.0-zh-cn.png)
多个正在运行的会话可能会同时进行表的局部排序操作，因此使用的总内存可能是psort_work_mem的好几倍。
**取值范围：**整型，64\~INT_MAX，单位为KB。
**默认值：**512MB
#### max_loaded_cudesc
**参数说明：**设置列存表在做扫描时，每列缓存cudesc信息的个数。增大设置会提高查询性能，但也会增加内存占用，特别是当列存表的列非常多时。
**参数类型：**USERSET
**取值范围：**整型，100\~INT_MAX/2
**默认值：**1024
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/notice_3.0-zh-cn.png)
max_loaded_cudesc设置过高时，有可能引起内存分配不足。
#### max_stack_depth
**参数说明：**设置DWS执行堆栈的最大安全深度。需要这个安全界限是因为在服务器里，并非所有程序都检查了堆栈深度，只是在可能递归的过程，比如表达式计算这样的过程里面才进行检查。
**参数类型：**SUSET
**设置原则：**
- 此参数的最佳设置是等于操作系统内核允许的最大值（就是ulimit -s的设置）。
- 如果设置此参数的值大于实际的内核限制，则一个正在运行的递归函数可能会导致一个独立的服务器进程崩溃。在DWS能够检测内核限制的操作系统上（SLES上），将自动限制设置为一个不安全的值。
- 因为并非所有的操作都能够检测，所以建议用户在此设置一个明确的值。
**取值范围：**整型，100\~INT_MAX，单位为KB。
**默认值：**2MB
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
默认值2MB，这个值相对比较小，不容易导致系统崩溃。但是可能会因为该值较小，导致无法执行复杂的函数。
#### cstore_buffers
**参数说明：**设置列存和OBS、HDFS外表列存格式（orc、parquet、carbondata）所使用的共享缓冲区的大小。
**参数类型：**POSTMASTER
**取值范围：**整型，16384～INT_MAX，单位为KB。
**默认值：**CN为32MB，DN取公式计算：POWER(2,ROUND(LOG(2,max_process_memory/18),0))
**设置建议**：
列存表使用cstore_buffers设置的共享缓冲区，几乎不用[shared_buffers]。因此在列存表为主的场景中，应减少shared_buffers，增加cstore_buffers。
OBS、HDFS外表使用cstore_buffers设置ORC、Parquet、Carbondata的元数据和数据的缓存，元数据缓存大小为cstore_buffers的1/4，最大不超过2GB，其余缓存空间为列存数据和外表列存格式数据共享使用。
#### dfs_max_memory
**参数说明：**设置orc导出时能占用的最大内存。如果导出大宽表时出现内存不足问题，可以调大此参数后重试。该参数仅8.3.0及以上集群版本支持。
**参数类型：**USERSET
**取值范围：**整型，131072 \~ 10485760，单位为KB
**默认值：**262144KB（256MB）
#### schedule_splits_threshold
**参数说明：**设置HDFS外表schedule阶段能够在内存中存储的最大文件个数，超过该限制时，将把文件列表下盘处理。
**参数类型：**USERSET
**取值范围：**整型，1\~INT_MAX
**默认值：**60000
#### bulk_read_ring_size
**参数说明：**并行导出，使用的环形缓冲区大小。
**参数类型：**USERSET
**取值范围：**整型，256\~INT_MAX，单位为KB。
**默认值：**16MB
#### check_cu_size_threshold
**参数说明**：列存表插入数据时，如果一个CU中已插入的数据量大于该参数时，开始进行行级大小校验，避免生成非压缩态大于1G的CU。
**参数类型**：USERSET
**取值范围**：整型，0\~1048576，单位为KB。
**默认值**：1GB
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/notice_3.0-zh-cn.png)
在进行行级大小校验时，如果多次校验不通过，建议先会话级设置该参数为0进行规避。
#### memory_spread_strategy
**参数说明**：调整自定义资源池DN内存扩展的策略。建议在内存充裕的业务场景进行调整，该参数设置后会提升查询性能，内存最高可以和默认资源池保持一致，但若业务场景中内存较小的情况下可能出现内存不足报错。该参数仅8.1.3及以上集群版本支持。
**参数类型**：USERSET
**取值范围**：枚举类型
- none表示不扩展内存
- negative表示按需扩展内存，算子按需扩展，估算的多扩展多，估算的小扩展的小。
- crazy表示直接扩展内存，等同于默认资源池的内存扩展策略，但在业务场景内存较小的情况下可能出现内存不足报错。
**默认值**：none
#### enable_global_syscache
**参数说明：**用于控制是否开启Global SysCache特性。环境中SysCache会消耗大量内存，当现网中SysCache机制出现严重问题无法使用其它手段规避时，打开此开关将SysCache关闭，解决SysCache占用内存高的问题。该参数仅9.1.1.100及以上集群版本支持。
**参数类型：**POSTMASTER
**取值范围**：布尔型
- on表示打开Global SysCache特性。
- off表示关闭Global SysCache特性。
**默认值：**on
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
新安装集群场景下，该参数默认值为on。升级场景下为保持前向兼容，该参数与升级前集群中该参数的默认值保持一致。
#### min_batch_rows
**参数说明：**设置内存攒批的最小行数，如果当前攒批达到该参数设置值就立即写入磁盘，否则先下盘继续攒批。该参数仅9.1.0.100及以上集群版本支持。
**参数类型：**USERSET
**取值范围**：整型，1000\~60000
**默认值：**10000
#### min_pck_batch_rows
**参数说明：**用于设置V3 hash分区表pck攒批的行数限制。该参数仅9.1.1.100及以上集群版本支持。
**参数类型：**USERSET
**取值范围**：整型，60000\~600000
**默认值：**600000
#### receive_cudesc_max_memory
**参数说明：**设置cudesc streaming在CU扫描过程中允许接收cudesc的最大内存。该参数仅9.1.0.100及以上集群版本支持。
**参数类型：**USERSET
**取值范围**：整型，4096\~1073741823，单位为KB。
**默认值：**65536
