KingbaseESV8R3对于order by null列的处理
背景
客户遇到一个现象order by 列是null的时候,最后一行总是显示相同的值。不要问我为什么对空值排序,意义何在?客户代码如此,客户不愿意改代码,作为dba大家都懂的。客户认为即使对null排序也能实现普通列的效果。要么定位为bug,要不给出合理解释。
分析
下面我们看一下测试过程,可以得出一个公式。select * from aaa order by name limit n offset f;
当表的总记录数 total>2*(n+f) 就得到:最后一行总是显示相同的值
[
](javascript:void(0)
TEST=# \d+ aaa;
Table "PUBLIC.AAA"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+----------+--------------+-------------
EE | INTEGER | | plain | |
NAME | TEXT | | extended | |
TEST=# select * from aaa;
EE | NAME
----+------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
(11 rows)
TEST=# select * from aaa order by name limit 2 offset 0;
EE | NAME
----+------
2 |
1 |
(2 rows)
TEST=# select * from aaa order by name limit 2 offset 1;
EE | NAME
----+------
3 |
1 |
(2 rows)
TEST=# select * from aaa order by name limit 2 offset 2;
EE | NAME
----+------
4 |
1 |
(2 rows)
TEST=# select * from aaa order by name limit 2 offset 3;
EE | NAME
----+------
5 |
1 |
(2 rows)
注意:根据公式 当 limit 2 offset 4 结果集排序如预期
TEST=# select * from aaa order by name limit 2 offset 4;
EE | NAME
----+------
5 |
6 |
(2 rows)
这正满足公式,total=11>(2+4) 不满足 ,所以排序结果正常。
[
](javascript:void(0)
结论
好了,这下我们了解的其对于null排序的内部算法,常规排序是所有记录都保存下来再进行排序,对于limit语句排序节点进行了优化,
如:select * from aaa order by name limit n offset f;
满足两个条件之一,排序节点会进行优化。
1,排序内存不够用
2,表的总记录数total>2*(n+f)
大概的优化是这样,内存中最多只保留(n+f)条记录,新的记录只需要与(n+f)的最大值或者最小值之一进行比较就可以快速筛掉不满足的纪录。
Note:以上的算法只是猜测,对于相同值的排序是不确定的,两个相同的值,排序的先后是不确定的,不能把结果依赖于不确定性的规律。
KingbaseESV8R3对于order by null列的处理的更多相关文章
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- Spark:几种给Dataset增加列的方式、Dataset删除列、Dataset替换null列
几种给Dataset增加列的方式 首先创建一个DF对象: scala> spark.version res0: String = .cloudera1 scala> val , , 2.0 ...
- order by null 的作用
在SQL中order by null有什么用吗?这是我在一次面试时面试官问我的问题,当时我是懵的.他让我猜一下,我说不排序?没想到被我猜对了 不排序你就别用order by啊!为什么要用order b ...
- Oracle与Sqlserver:Order by NULL值介绍
针对页面传参到in的子集中去进行查询操作的话,就会有in(xxx,null),这样就会导致查询的结果中其实直接过滤掉了null,根本就查不出来null的值.之前对于null的操作都是进行不同数据库的n ...
- MySQL为何不建议使用null列
Preface Null is a special constraint of columns.The columns in table will be added null cons ...
- null列的值不参与比较
假如数据库有表emp: empno name age 001 lucy 22 002 lily null 003 lilei nu ...
- C#程序读取数据库中包含null的列的值
private void btn2_Click(object sender, RoutedEventArgs e) { using (SqlConnection ...
- 面试官问我,为什么老司机建议MySQL列属性尽量用 NOT NULL ?
本文阅读时间大约6分钟. 其实写这篇文章,也是来自一个知识星球读者的提问,他在二面的过程中被问到了,由于他简历中写道有 MySQL 调优经验,但这个问题没有回答好,二面被刷了. 其实我们刚学习 C 语 ...
- mysql null值处理详细说明
在讲null之前,我们先看一个例子 表数据如下: 3306>select * from t1; +------+-------+ | id | name | +------+-------+ | ...
随机推荐
- UiPath文本操作Set Text的介绍和使用
一.Set Text的介绍 向输入框/文本框写入文本的一种操作 二.Set Text在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路 ...
- 浅议.NET遗留应用改造
浅议.NET遗留应用改造 TLDR:本文介绍了遗留应用改造中的一些常见问题,并对改造所能开展的目标.原则.策略进行了概述. 一.背景概述 1.概述 或许仅"遗留应用"这个标题就比较 ...
- 漫谈客户端存储技术之Cookie篇
Cookie 说到Cookie,不管作为前端开发人员还是后端开发人员并不陌生,作为一种最古老.最稳定的客户端存储形式,即便是在当下各种新的客户端存储技术层出不穷的时代,它仍旧有其一席之位.Cookie ...
- Jira7.3.8环境搭建
安装JDK sudo apt-get install openjdk-8-jdk 安装&配置MySQL sudo apt-get install mysql-server 创建jira用户 # ...
- Nginx工作模式
Master-Worker模式 1.Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程.2.接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理 ...
- 零基础学Java(8)数组
数组 数组存储相同类型值的序列. 声明数组 数组是一种数据结构,用来存储同一类型值的集合.通过一个整型下标(index,或称索引)可以访问数组中的每一个值.例如,如果a是一个整型数组,a[i]就是数组 ...
- 掌握CSS中的z-index
前言 z-index是一个用于控制文档中图层顺序的属性.具有较高z-index值的元素将会出现在具有较低值的元素之上.就像页面上的x轴和y轴决定一个元素在水平和垂直方向上的位置一样,z-index控制 ...
- 搞懂前端二进制系列(二):🍈File、FileReader与Base64
参考资料: JavaScript高级程序设计第四版:File API https://juejin.cn/post/7046313942938812424[前端二进制一次搞清楚] 一.File 类型 ...
- 从零开始Blazor Server(3)--添加cookie授权
认证方式简述 Blazor Server微软官方还是推荐直接使用Cookie授权,因为本来Blazor Server就是前后端不分离的.不存在Cookie跨域等一系列问题. 只要不是使用SSO之类的统 ...
- Linux ssh协议
基础知识 ssh:secure shell protocol,安全的远程登录 作用:是建立在应用层基础上的安全协议,实现数据传输过程中数据的加密,代替telent协议 使用tcp协议,端口号为22 s ...