查询预算
在执行查询之前,Vertica 会设计一个查询计划,并将其发送到将参与执行查询的每个节点。资源管理器评估每个节点上的计划,并估算节点执行其查询部分需要的内存量和并发程度。这是查询预算,Vertica 将其存储在系统表
V_MONITOR.RESOURCE_POOL_STATUS
的 query_budget_kb
列中。
查询预算基于查询将执行的资源池的几个参数设置:
-
MEMORYSIZE
-
MAXMEMORYSIZE
-
PLANNEDCONCURRENCY
您可以使用
ALTER RESOURCE POOL
修改 GENERAL 资源池的 MAXMEMORYSIZE
和 PLANNEDCONCURRENCY
。此资源池通常执行未分配给用户定义资源池的查询。您可以在使用
CREATE RESOURCE POOL
或者稍后使用
ALTER RESOURCE POOL
创建任何由用户定义的资源池时设置所有三个参数。
计算 GENERAL 池查询预算
Vertica 使用以下公式计算 GENERAL 池中的查询预算:
queryBudget = queuingThresholdPool / PLANNEDCONCURRENCY
注意
Vertica 将 GENERAL 池的排队阈值计算为其MAXMEMORYSIZE
设置的 95%。
计算用户定义的资源池的查询预算
对于用户定义的资源池,Vertica 使用以下算法:
-
如果
MEMORYSIZE
设置为 0 并且MAXMEMORYSIZE
未设置:queryBudget = queuingThresholdGeneralPool / PLANNEDCONCURRENCY
-
如果
MEMORYSIZE
设置为 0 并且MAXMEMORYSIZE
设置为非默认值:query-budget = queuingThreshold / PLANNEDCONCURRENCY
注意
Vertica 将用户定义的池的排队阈值计算为其MAXMEMORYSIZE
设置的 95%。 -
如果
MEMORYSIZE
设置为非默认值:queryBudget = MEMORYSIZE / PLANNEDCONCURRENCY
通过仔细调整资源池的 MEMORYSIZE
和 PLANNEDCONCURRENCY
参数,可以控制能够为查询预算多少内存。
当心
查询预算通常不需要调整,但是,如果由于其他目的需要内存而减少 MAXMEMORYSIZE
,请注意这样做也会减少查询预算。减少查询预算会对查询性能产生负面影响,尤其是在查询很复杂的情况下。
为了保持资源池的原始查询预算,一定要一起减小参数 MAXMEMORYSIZE
和 PLANNEDCONCURRENCY
。