测试版本:--03134283938-20221019-172201-20018
达梦的排序机制由四个dm.ini参数控制:
#maximum sort buffer size in Megabytes ,有效值范围(1~2048)
SORT_BUF_SIZE = 100
#maximum sort blk size in Megabytes,有效值范围(1~50)
SORT_BLK_SIZE = 1
#maximum global sort buffer size in Megabytes,有效值范围(10~4294967294)
SORT_BUF_GLOBAL_SIZE = 500
#choose method of sort
SORT_FLAG = 1
SORT_FLAG,0代表传统排序机制,1代表新排序机制。
新排序机制时,系统均为每一个进行排序操作的会话在全局排序区至少分配1个内存分片。根据排序的尺寸需要,最多可扩展至SORT_BUF_GLOBAL_SIZE。当会话无法扩展时,则使用临时表空间协助完成排序,这时可以通过v$mtab_used_history查询。
排序操作至少需要抢占一个内存分片,当全局排序区耗尽时,后续会话的排序操作将报-544错误。
-
下面我们做一个实验
会话1:
提前准备包含20000000行数据的d表,读取d表数据排序后插入e表。
insert into e select * from d order by 2;
会话2:
查询内存池的使用情况
#查询内存池的使用情况
SQL> select a.name pool,total_size/1024/1024.0 Mbytes,FILE_NAME
from v$mem_pool a
where a.name in ('VDTA POOL','RT_MEMOBJ_VPOOL')
order by 2 desc limit 2
#会话1执行中的查询结果:
LINEID POOL MBYTES FILE_NAME
---------- --------------- ------ ------------------------------------------------------
1 VDTA POOL 432.75 /home/dmops/build/svns/1666183702277/nsort_dll/nsort.c
2 RT_MEMOBJ_VPOOL 168 /home/dmops/build/svns/1666183702277/op/xsort3.c
#查询临时表空间的使用情况
SQL> select MTAB_TYPE,MTAB_USED_BY_M,SQL_TEXT from v$mtab_used_history;
无
-
实验2
两个会话同时执行
insert into e select * from d order by 2;
#查询内存池的使用情况
SQL> select a.name pool,total_size/1024/1024.0 Mbytes,FILE_NAME
from v$mem_pool a
where a.name in ('VDTA POOL','RT_MEMOBJ_VPOOL')
order by 2 desc limit 2
#执行中的查询结果
第一次查报:
[-544]:Out of sort buf space, try to adjust SORT_BUF_GLOBAL_SIZE, SORT_BUF_SIZE, SORT_BLK_SIZE.
used time: 13.077(ms)
过一会儿查结果为:
LINEID POOL MBYTES FILE_NAME
---------- --------------- ------ ------------------------------------------------------
1 VDTA POOL 432.75 /home/dmops/build/svns/1666183702277/nsort_dll/nsort.c
2 RT_MEMOBJ_VPOOL 168 /home/dmops/build/svns/1666183702277/op/xsort3.c
#查询临时表空间的使用情况
LINEID MTAB_TYPE MTAB_USED_BY_M SQL_TEXT
---------- --------- -------------- -----------------------------------------
1 FLUSH 72 INSERT INTO E SELECT * FROM D ORDER by 2;
2 NSORT 109 INSERT INTO E SELECT * FROM D ORDER by 2;
3 NSORT 217 INSERT INTO E SELECT * FROM D ORDER by 2;
4 NSORT 289 INSERT INTO E SELECT * FROM D ORDER by 2;
由上可见,监控本身也包含排序操作。第一次执行时由于排序空间耗尽,所以报-544错误。过了一会儿排序空间释放了一部分,监控语句抢到一部分内存用于排序,所以查出结果。
-
实验3
三个会话同时执行
insert into e select * from d order by 2;
#查询内存池的使用情况
SQL> select a.name pool,total_size/1024/1024.0 Mbytes,FILE_NAME
from v$mem_pool a
where a.name in ('VDTA POOL','RT_MEMOBJ_VPOOL')
order by 2 desc limit 5
#执行中的查询结果
第一次查报:
[-544]:Out of sort buf space, try to adjust SORT_BUF_GLOBAL_SIZE, SORT_BUF_SIZE, SORT_BLK_SIZE.
used time: 13.077(ms)
#调大SORT_BUF_GLOBAL_SIZE
sp_set_para_value(1,'SORT_BUF_GLOBAL_SIZE',2000);
再查结果为:
LINEID POOL MBYTES FILE_NAME
---------- --------------- -------------- ------------------------------------------------------
1 VDTA POOL 432.75 /home/dmops/build/svns/1666183702277/nsort_dll/nsort.c
2 VDTA POOL 229.5625 /home/dmops/build/svns/1666183702277/nsort_dll/nsort.c
3 VDTA POOL 225.9375 /home/dmops/build/svns/1666183702277/nsort_dll/nsort.c
4 RT_MEMOBJ_VPOOL 168.8076171875 /home/dmops/build/svns/1666183702277/op/xsort3.c
5 RT_MEMOBJ_VPOOL 168.5078125 /home/dmops/build/svns/1666183702277/op/xsort3.c
由上可见,监控本身也包含排序操作。第一次执行时由于排序空间耗尽,所以报-544错误。执行sp_set_para_value(1,'SORT_BUF_GLOBAL_SIZE',2000)将全局排序区扩大到2000M后再执行上面的查询语句不再报错。