【 使用环境 】测试环境
【 OB or 其他组件 】observer
【 使用版本 】OceanBase_CE 4.3.5.4
【问题描述】
根据文档描述, 有 union
、sort
、group by
等场景时,可能会出现工作区内存不足的报错。
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002015986
【复现路径】
疑问:
1、union
、sort
、group by
这些操作是否都是纯内存操作,不会生成磁盘临时文件?
2、如果都是纯内存操作这个实验的排序大sql应该足以将工作内存占满,但sql运行许久并没有报错。如何能复现到工作区内存不足报错呢。
实验:
### 2.1 创建1c2g租户,后面都是使用的这个租户
CREATE RESOURCE UNIT unit1 MAX_CPU 1,MAX_IOPS 128,MEMORY_SIZE 2147483648,MAX_IOPS 1024;
### 2.2 修改 ob_sql_work_area_percentage 参数
set global ob_sql_work_area_percentage=1;
obclient(root@tenant1)[oceanbase]> select * from V$OB_SQL_WORKAREA_MEMORY_INFO;
+-------------------+--------------------+------------------------+------------+----------------+------------------+------------+----------------+-------------------+-----------+-----------+----------+
| MAX_WORKAREA_SIZE | WORKAREA_HOLD_SIZE | MAX_AUTO_WORKAREA_SIZE | MEM_TARGET | TOTAL_MEM_USED | GLOBAL_MEM_BOUND | DRIFT_SIZE | WORKAREA_COUNT | MANUAL_CALC_COUNT | TENANT_ID | SVR_IP | SVR_PORT |
+-------------------+--------------------+------------------------+------------+----------------+------------------+------------+----------------+-------------------+-----------+-----------+----------+
| 10737418 | 4194304 | 7229548 | 7229548 | 692785 | 1048576 | -2097152 | 0 | 409 | 1002 | 127.0.0.1 | 2882 |
+-------------------+--------------------+------------------------+------------+----------------+------------------+------------+----------------+-------------------+-----------+-----------+----------+
1 row in set (0.013 sec)
### 2.3 创建大表
create table t1(id int primary key auto_increment,name longtext);
insert into t1 select null,repeat('abcdefg',100000);
insert into t1 select null,repeat('abcdefg',100000) from t1;
.... 循环十几次
insert into t1 select null,repeat('abcdefg',100000) from t1;
update t1 set name=concat(id,name)
### 2.4执行排序大sql
select * from t1 order by name desc ; --运行十几分钟后依旧在运行,并没有报错工作区内存不足