背景

客户遇到一个现象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列的处理的更多相关文章

  1. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  2. Spark:几种给Dataset增加列的方式、Dataset删除列、Dataset替换null列

    几种给Dataset增加列的方式 首先创建一个DF对象: scala> spark.version res0: String = .cloudera1 scala> val , , 2.0 ...

  3. order by null 的作用

    在SQL中order by null有什么用吗?这是我在一次面试时面试官问我的问题,当时我是懵的.他让我猜一下,我说不排序?没想到被我猜对了 不排序你就别用order by啊!为什么要用order b ...

  4. Oracle与Sqlserver:Order by NULL值介绍

    针对页面传参到in的子集中去进行查询操作的话,就会有in(xxx,null),这样就会导致查询的结果中其实直接过滤掉了null,根本就查不出来null的值.之前对于null的操作都是进行不同数据库的n ...

  5. MySQL为何不建议使用null列

      Preface       Null is a special constraint of columns.The columns in table will be added null cons ...

  6. null列的值不参与比较

    假如数据库有表emp: empno name   age 001      lucy      22 002      lily        null 003      lilei       nu ...

  7. C#程序读取数据库中包含null的列的值

    private void btn2_Click(object sender, RoutedEventArgs e)         {             using (SqlConnection ...

  8. 面试官问我,为什么老司机建议MySQL列属性尽量用 NOT NULL ?

    本文阅读时间大约6分钟. 其实写这篇文章,也是来自一个知识星球读者的提问,他在二面的过程中被问到了,由于他简历中写道有 MySQL 调优经验,但这个问题没有回答好,二面被刷了. 其实我们刚学习 C 语 ...

  9. mysql null值处理详细说明

    在讲null之前,我们先看一个例子 表数据如下: 3306>select * from t1; +------+-------+ | id | name | +------+-------+ | ...

随机推荐

  1. NC16462 [NOIP2015]跳石头

    NC16462 [NOIP2015]跳石头 题目 题目描述 一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块 ...

  2. Codeforces Round #789 (Div. 2)

    题集链接 A. Tokitsukaze and All Zero Sequence 题意 Tokitsukaze 有一个长度为 n 的序列 a. 对于每个操作,她选择两个数字 ai 和 aj (i≠j ...

  3. 记一次 .NET 某新能源系统 线程疯涨 分析

    一:背景 1. 讲故事 前段时间收到一个朋友的求助,说他的程序线程数疯涨,寻求如何解决. 等我分析完之后,我觉得这个问题很有代表性,所以拿出来和大家分享下,还是上老工具 WinDbg. 二: WinD ...

  4. Collections集合工具类的方法_sort(List)和sort(List,Comparator)方法

    Comparator比较器 我们还是先研究这个方法 public static <T> void sort(List<T> list):将集合中元素按照默认规则排序. 不过这次 ...

  5. Scanner的使用步骤和匿名对象的说明

    Scanner使用步骤 查看类 ~java.util.Scanner :该类需要import导入后使用. 查看构造方法 ~public Scanner(InputStream source) : 构造 ...

  6. 智能指针思想实践(std::unique_ptr, std::shared_ptr)

    1 smart pointer 思想 ​ 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ​ ...

  7. gerrit系统如何配置访问控制

    . 版本:v0.3 作者:河东西望 日期:2022-7-13 . 目录 1 关键概念 2 需求场景 3 配置策略 gerrit系统的上手使用有两个难点: 部署repo仓库. 配置访问控制. 想要上手使 ...

  8. java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.

    RSA用私钥签名的时候发现报错,删除以下内容即可 -----BEGIN PRIVATE KEY----- -----END PRIVATE KEY----- import org.apache.com ...

  9. VGA设计(原理说明。Verilog代码实现,仿真结果)

    各类显示屏的显示原理大部分是利用人眼的视觉暂留效应.比如之前的数码管显示就是设计每个周期内各个小段按顺序显示,来达到显示一个数字的效果. VGA同理,显示屏在显示时是一个像素一个像素地显示,在人眼看来 ...

  10. DDS信号发生器加强版(双通道,发送波形的频率可控,相位可控,种类可控)

    目的:设计一个DDS,可以输出两个波形,输出的波形的周期可以修改,相位可以修改,种类也可以修改 输入:clk,reset,一个控制T的按键,一个控制相位的按键,一个控制波形种类的按键. 思路:双通道- ...