您的位置:首页 > 其它

HashData 内存相关参数说明

2018-03-16 13:23 211 查看

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


如果设置了资源队列,则该值的最大值为: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、当一个查询开始知道结束,将直接使用 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
4000
AS SELECT, 和 DECLARE CURSOR 受限,如果配置参数resource_select_only = off,则 INSERT, UPDATE,DELETE 语句也会受限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: