达梦的排序机制由四个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代表新排序机制。
传统排序机制时,系统为每一个进行排序操作的会话分配SORT_BUF_SIZE大小的本地排序区。如果排序的尺寸大于SORT_BUF_SIZE,则使用临时表空间协助完成排序。
达梦8 探寻达梦排序原理:传统排序机制(SORT_FLAG=0)
新排序机制时,系统为每一个进行排序操作的会话在全局排序区分配至少1个内存分片(SORT_BLK_SIZE)。根据排序的尺寸需要,最多可扩展至SORT_BUF_GLOBAL_SIZE。当内存无法扩展时,则使用临时表空间协助完成排序。排序操作至少需要抢占一个内存分片,当全局排序区耗尽时,后续会话的排序操作将报-544错误。
达梦8 探寻达梦排序原理:新排序机制(SORT_FLAG=1)
相比较而言,传统排序机制缺乏灵活性。当系统中会话很多的时候,总体上可能消耗过多内存。而大的会话却由于本地buffer不够而使用临时表空间完成排序,SQL响应时间达不到预期。
新排序机制解决了上述问题。小会话可以使用一个分片(默认1M),大会话可以自由扩展至总内存不超过SORT_BUF_GLOBAL_SIZE。但新排序机制也有明显的缺点:当代码编写不好的时候,某异常SQL可能耗光整个全局排序区,造成后续需要排序的会话都无法进行。
当异常出现时,传统排序机制的用户体验是某功能很慢,新排序机制是有程序报错退出!