达梦8 探寻达梦排序原理:新排序机制(SORT_FLAG=1)

2024-06-09 08:20

本文主要是介绍达梦8 探寻达梦排序原理:新排序机制(SORT_FLAG=1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试版本:--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后再执行上面的查询语句不再报错。

这篇关于达梦8 探寻达梦排序原理:新排序机制(SORT_FLAG=1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044658

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序