绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
HashData 内存相关参数说明
2022-02-16 14:39:10

max_statement_mem

设置每个查询大使用的内存量,该参数是防止 statement_mem 参数设置的内存过大导致的内存溢出。

statement_mem

设置每个查询在 segment 主机中可用的内存,该参数设置的值不能超过 max_statement_mem 设置的值,如果配置了资源队列,则不能超过资源队列设置的值,其计算公式为 ( gp_vmem_protect_limitGB * .9 ) / max_expected_concurrent_queries

例如: gp_vmem_protect_limit 设置为 8192MB (8GB) ,查询的大并发量为 40,其中10% 为缓存空间,则 statement_mem 计算如下:

(8GB * .9) / 40 = .18GB = 184MB
  • 1

如果设置了资源队列,则该值的大值为:min(MEMORY_LIMIT, max_statement_mem)

gp_vmem_protect_limit

设置 segment 中所有的进程可用的内存,如果查询所使用的内存超过该内存值,则查询失败。该参数为本地参数,需要对所有的 primary 和 mirror 进行设置

资源队列:

MEMORY_LIMIT

该值不应超过一台 segment 物理机节点的内存,该值设置队列中所有活跃查询在计算节点中可使用的大内存值。每个查询可用的内存为该值除以 active_statements 的值。 
例如:MEMORY_LIMIT 的值为 2000MB,active_statements 的值为 10,则队列中的每个查询默认分配的内存为 200MB.在 session 级别,该值可以被系统参数 statement_mem 覆盖,这样允许当前查询使用对应资源队列里的所有内存,而不影响其他的资源队列。 
例如:

=> SET statement_mem=’2GB’; 
=> SELECT * FROM my_big_table WHERE column=’value’ ORDER BY id; 
=> RESET statement_mem;
  • 1
  • 2
  • 3

注意: 
1、当一个查询开始知道结束,将直接使用 200M 内存,即使实际使用的内存没有 200M 
2、当使用 statement_mem 参数覆盖默认 MEMORY_LIMIT 值时候,可能会发生还未达到 active_statements 的值,但是内存被耗尽的情况,当出现这种情况的时候,队列中的其他查询会等待

MEMORY_LIMIT 
队列中可以执行的查询的总数(大并发数),当该值被消耗完,则新的查询需要等待

PRIORITY 
查询中 cpu 的使用率,该值可以设置为以下级别:LOW, MEDIUM, HIGH, MAX

MAX_COST 
限制查询计划的消耗

注意: 
1、官方建议使用 MEMORY_LIMIT 和 ACTIVE_STATEMENTS 来替代 max_cost 
2、如果队列中未设置 MEMORY_LIMIT,则每个查询可用的内存值为系统参数 statement_mem 的值,大可用内存为 statement_mem /ACTIVE_STATEMENTS 
3、并不是所有语句都受资源队列限制,默认情况下,只有 SELECT, SELECT INTO, CREATE TABLE AS SELECT, 和 DECLARE CURSOR 受限,如果配置参数resource_select_only = off,则 INSERT, UPDATE,DELETE 语句也会受限。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

HashData
创建时间:2022-02-16 10:39:02
HashData
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • gaokeke123
    专家
戳我,来吐槽~