版本:5.7.25-OceanBase_CE-v4.3.5.1
内存配置:
报错信息:
SQL error [11049] [HY000]: Exceed query memory limit
(mem_limit=9663676400, mem_hold=9667026944), please check whether the query_memory_limit_percentage configuration item is reasonable.
问题描述:
示例sql在下方:
通过update left join set的写法对多个值进行更新,但是最终更新的值依赖于上一个同样字段值的结果。其中右表为空,左表有600多行。整个sql大概有2千行左右的更新。同样的sql,mysql可以执行,放到OB上就出错了,是配置的问题还是不支持呢?
UPDATE ht.test_data a LEFT JOIN ht.custom b ON a.kind = b.kind AND a.id = b.id
SET
a.product_num = CASE WHEN a.product_time >= (CASE WHEN ISNULL(b.woking_day) = 0 AND LENGTH(trim(b.woking_day)) > 0 THEN b.woking_day ELSE '0900' END) AND a.product_time <= (CASE WHEN ISNULL(b.break_day) = 0 AND LENGTH(trim(b.break_day)) > 0 THEN b.break_day ELSE '1700' END) THEN (CASE WHEN ISNULL(b.product_num1) = 0 AND b.product_num1 > 0 THEN b.product_num1 ELSE '75' END) ELSE (CASE WHEN ISNULL(b.product_num2) = 0 AND b.product_num2 > 0 THEN b.product_num2 ELSE '175' END) END,
a.product_num = (CASE WHEN a.tminmn > a.product_num THEN a.tminmn ELSE a.product_num END) * a.product_num_tt,
a.product_num = CASE WHEN (a.product_num > a.product_num_high AND a.product_num_high > 0 AND (a.product_num - a.product_num_high) * 100 / a.product_num_high <= 35) OR (a.product_num < a.product_num_low AND a.product_num_low > 0 AND (a.product_num_low - a.product_num) * 100 / a.product_num_low <= 35) THEN a.product_num + 6
WHEN (a.product_num > a.product_num_high AND a.product_num_high > 0 AND (a.product_num - a.product_num_high) * 100 / a.product_num_high <= 70) OR (a.product_num < a.product_num_low AND a.product_num_low > 0 AND (a.product_num_low - a.product_num) * 100 / a.product_num_low <= 70) THEN a.product_num + 40
ELSE a.product_num + 20 END,
a.product_num = a.product_num + (CASE WHEN SUBSTRING(a.kind, 1, 4) IN ('test') THEN 20 ELSE 10 END),
a.product_num = CASE WHEN product_time >= (CASE WHEN ISNULL(b.woking_day) = 0 AND LENGTH(trim(b.woking_day)) > 0 THEN b.woking_day ELSE '0900' END) AND product_time <= (CASE WHEN ISNULL(b.break_day) = 0 AND LENGTH(trim(b.break_day)) > 0 THEN b.break_day ELSE '1700' END) AND b.product_num_fix_mn1 IS NOT NULL AND b.product_num_fix_mn1 > 0 THEN b.product_num_fix_mn1
ELSE a.product_num END,
a.product_num_flg = CASE WHEN a.product_num_err >= a.product_num AND a.product_num_last_low = 0 THEN 'y' ELSE 'n' END