设置查询内存使用
设置查询内存使用#
设置资源队列上的MEMORY_LIMIT参数会限制通过队列提交的所有活动查询在segment上可以消耗的最大内存量。每个查询被分配的内存量等于队列内存限制除以活动语句限制数。例如,如果一个队列的内存限制为2000MB,活动语句限制为10,则通过该队列提交的每个查询默认被分配200MB的内存。可以使用statement_mem在每个查询基础上覆盖默认的内存分配(不超过队列内存限制)。一旦查询开始运行,在执行期间即使实际消耗的内存少于分配的内存量,它也会保持在队列中分配的内存直至完成。
可以使用statement_mem来覆盖当前资源队列设置的内存限制。在会话级别,可以将statement_mem增加到资源队列的MEMORY_LIMIT。这将允许单个查询使用分配给整个队列的所有内存,而不影响其他资源队列。但statement_mem超过MEMORY_LIMIT将没办法分配成功。
statement_mem的值受max_statement_mem的限制(超级用户参数)。对于设置了MEMORY_LIMIT的资源队列中的查询,statement_mem的最大值为min(MEMORY_LIMIT, max_statement_mem)。当查询被接受时,分配给它的内存会从MEMORY_LIMIT中扣除。如果MEMORY_LIMIT用尽,则同一资源队列中的新查询必须等待。即使ACTIVE_STATEMENTS尚未达到,这种情况只有在使用statement_mem覆盖资源队列分配的内存时才会发生。
例如,考虑一个名为adhoc的资源队列,具有以下设置:
MEMORY_LIMIT: 1.5GB
ACTIVE_STATEMENTS: 3
默认情况下,提交到队列的每个语句分配500MB的内存。现在考虑以下事件序列:
用户ADHOC_1提交查询Q1,并覆盖STATEMENT_MEM为800MB。Q1语句被系统接受。
用户ADHOC_2提交查询Q2,使用默认的500MB。
在Q1和Q2仍在运行时,用户ADHOC_3提交查询Q3,使用默认的500MB。
查询Q1和Q2已经使用了队列1500MB中的1300MB。因此,Q3必须等待Q1或Q2完成才能运行。
如果队列上没有设置MEMORY_LIMIT(即MEMORY_LIMIT==-1),则可以接受查询直到所有ACTIVE_STATEMENTS插槽被使用,并且每个查询可以设置任意大小的statement_mem。这可能导致资源队列使用不受限制的内存量。