原 GreenPlum报错ERROR: Canceling query because of high VMEM usage 或 ERROR: Out of memory Vmem limit reached
现象
查询报错:ERROR: Canceling query because of high VMEM usage.
ERROR: Canceling query because of high VMEM usage. Used: 16368MB, available 1900MB, red zone: 17110MB (runaway_cleaner.c:202) (seg14 slice2 192.110.26.106:6002 pid=899) (runaway_cleaner.c:202) CONTEXT: SQL statement "refresh materialized view mv_ygz with data" PL/pgSQL function refresh_mv_ygz() line 3 at SQL statement
ERROR: Canceling query because of high VMEM usage. Used: 1235MB, available 204MB, red zone: 10444MB (runaway_cleaner.c:202) (seg8 110.111.111.77:6002 pid=31733) (runaway_cleaner.c:202)
ERROR: Out of memory (seg5 110.111.111.76:6002 pid=45050)
DETAIL: Vmem limit reached, failed to allocate 1022977928 bytes from tracker, which has 772 MB available
可能原因
1、在会话级别配置optimizer为off。
若数据量很小,但查询SQL复杂,若启用optimizer,则往往会报这个错,所以,此时可以在SQL级别禁用该参数。
1 2 3 4 | set optimizer=off; -- 若是物化视图报错,则可以手动刷新1次物化视图 select refresh_mv_ygz(); |
参数optimizer表示运行SQL查询时启用或禁用GPORCA。 默认on。 如果禁用GPORCA,Greenplum数据库仅使用Postgres查询优化器。
GPORCA与Postgres查询优化器共存。 启用GPORCA后,Greenplum数据库会尽可能使用GPORCA为查询生成执行计划。 如果无法使用GPORCA,则使用Postgres查询优化器。
可以为数据库系统,单个数据库或会话或查询设置optimizer参数。
2、修改如下几个参数