首页 >> 知识 >> 达梦和mysql的排序规则不一致

达梦和mysql的排序规则不一致

达梦排序原理 一、简介 ·排序操作就是将一组数据按照指定列值的指定顺序方式进行输出显示。 查询中的排序ORDER BY字句语法如下: ::=ORDER [SIBLINGS] BY ::=< order_by_item >{,>order_by_item>} ::= [ASC | DESC] [NULLS FIRST|LAST] ::= | |

·不仅是显示指定ORDER BY子句会产生排序操作。创建索引,收集统计信息等操作会生成ORDER BY字句。分组,去重,集合运算等操作时也有可能会先对数据进行排序操作,再基于有序数据进行下一步实现。

二、实现原理 ORDER BY 在内部操作符的实现就是生成一个XSORT操作符。

·XSORT操作符执行 1.下方操作符第一次返回数据时,根据预估行数和排序内存INI参数取值,调整本次排序实际使用内存值,申请好排序将要使用的数据空间。 2. SORT_FLAG=0时 将下方操作符传上来的每批数据存入数据空间,直到数据全部存入内存中时,对内存中的数据按照预先设定好的排序列和排序特征使用排序算法进行排序,再分批向上层操作符返回数据即可。 SORT_FLAG=1时 不同于=0时,数据空间并不是一整片,而是划分为小片,下方操作符传来的数据依次去填入并填满每一小片空间,数据全部存完时,先对每一小片中的数据进行排序,再所有小片的有序数据进行归并排序,即可得到整体有序结果,再向上返回。

·内存不够存下所有数据时,则需要借助磁盘空间: 下层操作符数据传给XSORT时,判断若申请好的内存空间已放不下这批数据,则会将已存入内存的数据进行排序,将排好序的数据写入磁盘,清空内存空间的数据再将这批数据写入内存空间,以此类推直到数据处理完毕。最后一批数据排好序后也写入磁盘,接下来就是利用该内存空间将每一批磁盘内排好序的数据进行归并排序并输出,再向上返回即可。

·若有去重DISTINCT需求,则每次排好序后,对相邻数据行之间进行比较,若相同则只需要输出其中一行即可。

三、相关参数 ·SORT_FLAG 0表示整片数据排序,1表示大内存分片数据排序,2是为保证排序后相同数据不被打乱。目前还有取值3,同时具备1和2的功能。

·.SORT_BUF_SIZE(会话级) SORT_FLAG=0时的单次排序最大排序内存空间取值。

·SORT_BUF_GLOBAL_SIZE(系统级) SORT_FLAG=1时的系统级最大排序内存空间取值,即所有分片空间的总和。

·SORT_BLK_SIZE SORT_FLAG=1时每一片分片空间的大小。

·TSORT_OPT =0时,按照下层计划估算行数计算内存空间并申请分配内存,最少也有2M; =1时,若下层实际返回的行数较少时,则根据实际行数计算所需内存来申请分配。

·SORT_ADAPTIVE_FLAG(2023年年中出现) 基于性能考虑,自动调整排序内存相关参数。普通场景中性能效果不明显,但极端场景中内存调整十分有用。

四、调整策略 1.避免刷盘 计算排序单行数据行长,和实际总行数相乘,算出实际排序所需内存值。再与SORT_BUF_SIZE(SORT_FLAG=0时)/SORT_BUF_GLOBAL_SIZE(SORT_FLAG=1时)比较去进行调整。行长可以根据计划展示中最后一个数字直接得到。

2.避免参数值和实际值差别过大 会产生多余的内存分配和初始化的动作,资源浪费,影响性能。 可以手动调整,服务器也会简单自动调整,另外在开启SORT_ADAPTIVE_FLAG时会进行更有针对性的调整。

3.避免多趟归并排序 若归并时路数过多,可能会产生多趟归并排序,影响性能。

五、使用建议 ·性能分析 1.ET()查看排序耗时 2.查询V$MTAB_USED_HISTORY判断是否刷盘进而调整参数

·排序消除 1.单表,排序列为前导列创建索引 2.连接,hash连接右孩子的排序列为前导列创建索引,或者考虑让其使用IJI,并且排序表在IJI左侧 3.TOP_ORDER_OPT_FLAG,即使消除排序使用到的索引没有包含全部使用列,后续需要BLKUP,但也会有限考虑消除排序。一些参数取值包含ROWNUM的优化为TOP,目的也是为了消除排序。

六、问题总结 ·SORT_BUF_SIZE和SORT_BUF_GLOBAL_SIZE可以同时使用,建立索引排序时也可以使用这套方案。 ·支持多线程一起排序。 ·相关参数理论上具有独立性,但实际情况可能会有函数关联性,需要具体情况具体分析。 ·SORT_BUF_SIZE上限可能会比SORT_BUF_GLOBAL_SIZE小;即使使用机器内存比较小,但是对大表进行创建索引、order by排序等操作,SORT_FLAG数值不同,效率也是有区别的,即使SORT_BUF_SIZE和SORT_BUF_GLOBAL_SIZE值相同。 ·大部分情况下应该设置SORT_ADAPTIVE_FLAG=1,可以兼容

网站地图