偶小梦
发布于

insufficient memory reserved for statement

➢ 问题
执行查询时报错"insufficient memory reserved for statement",,"Increase statement memory or reduce the number of Parquet tables to be scanned."
➢ 分析

  1. 对于 INSERT,每个未加压缩的表所占内存为 rowgroupSize;而每个加压缩的表所占内存为 2 * rowgroupSize
  2. 对于 SELECT,每个未加压缩的表所占内存为 Sum(toBeselectedAttributeLen)/wholeRecordLen * rowgroupSize ;而每个加压缩的表所占内存为 2 * Sum(toBeselectedAttributeLen)/wholeRecordLen * rowgroupSize
    ➢ 解答
  3. 在 session 级别调大 hawq_rm_stmt_nvseg (默认值为 0):SET HAWQ_RM_STMT_NVSEG=X; 或者
  4. 在 session 级别调大 hawq_rm_stmt_vseg_memory (默认值为 128 MB):SET HAWQ_RM_STMT_VSEG_MEMORY='Xmb’;或者
  5. 调大资源队列的资源量:ALTER RESOURCE QUEUE queue1 WITH (VSEG_RESOURCE_QUOTA='mem:Xmb’);
    ➢ 参考
    https://community.pivotal.io/s/article/88-Getting-Insufficient-Memory-Reserved-for-Statement-Error-for-Parquet-Tables
评论(2)
  • oushu9300 回复

    可以将资源队列 quota 调大
    ALTER RESOURCE QUEUE vc_default.pg_default WITH (VSEG_RESOURCE_QUOTA='mem:512mb');

  • huor
    huor 回复

    对于分区表,执行查询语句需要的内存为:分区子表总数*100KB,且 hawq_rm_stmt_nvseg 需要和该表的建表时的分桶数一致。换句话说,对分区父表计数前临时设置这两个参数,从达到调整内存限制的目的:

    set hawq_rm_stmt_vseg_memory = '1024mb';
    set hawq_rm_stmt_nvseg=8;
    
test