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 语句也会受限。