背景

客户遇到一个现象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. Python Socket Sever

    1. Server code 1 # !/usr/bin/env python 2 # coding:utf-8 3 import multiprocessing 4 import socket 5 ...

  2. 程序员必备,一款让你提高工作效率N倍的神器uTools

    下载地址:https://www.aliyundrive.com/s/f7PU7QxdxEz uTools 是什么? uTools = your tools(你的工具集) uTools 是一个极简.插 ...

  3. Windows下maven配置环境变量

    右键 "计算机",选择 "属性",之后点击 "高级系统设置",点击"环境变量",来设置环境变量,有以下系统变量需要配置: ...

  4. Tapdata 等40余家行业知名企业,应邀参与共建 NextArch Foundation

      日前,Linux 基金会执行董事 Jim Zemlin 于 Linux 基金会会员峰会(The Linux Foundation Member Summit)上宣布,Linux 基金会正式成立 N ...

  5. Eclipse 安装配置和 Git 创建代码库 教程

    1. Eclipse 安装 http://www.eclipse.org/downloads/ 这是eclipse的官网,进入下载,步骤如下图: 选择Download或者下面的 [Select Ano ...

  6. jenkins多分支构建选择

    通常开发提交到git上的代码会有多个分支,比如master分支.release分支等,少则1.2个,多则10几20几个:当构建的时候,如果不配置多分支构建,每构建一个新的分支,就需要修改配置,如果没有 ...

  7. 判断语句的嵌套和switch判断

    Scanner scanner = new Scanner(System.in);int i = scanner.nextInt();int i2 = scanner.nextInt();if (i& ...

  8. python打开文件、文件夹窗口、终端窗口

    简介 在一些项目中,我们会需要在生成完文件后打开某些文件或者文件夹窗口,这就需要使用到内置的文件打开方式了. 打开文件或文件夹 Windows import os import subprocess ...

  9. 2537-springsecurity系列--关于session的管理2-session缓存和共享

    版本信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  10. Frame双向通信插件FrameDataTrans

    FrameDataTrans教程 博客园 乳鸽菌 20220729 核心原理是使用postMessage发送数据,window.addEventListener("message" ...