Orasort:利用Oracle过期专利实现5倍加速的列排序算法
摘要
Orasort是Oracle的专利列排序算法,可实现5倍更快的排序速度。该专利于2024年到期后进入公有领域,使得云公司和开源数据库(如MySQL和PostgreSQL)能够集成该算法。
暂无内容
查看缓存全文
缓存时间: 2026/07/06 20:06
# Oracle 的秘密列排序技术在专利到期后公开,使排序速度提升 5 倍 – deepsystemstuff.com
来源:https://deepsystemstuff.com/how-oracles-secret-column-sorting-technique-became-public-after-its-patent-expired-making-sorting-5x-faster/
Oracle 排序算法专利已过期;现进入公有领域。
Oracle 是全球最流行的数据库产品之一。
高度复杂的应用依赖 Oracle 来存储关键数据和事务。
为了提升数据库的速度和可靠性,Oracle 发明了许多优化技术。
其中一项发明是针对数据库表的排序技术。
Oracle 发明了一种名为 Orasort 的算法,使排序速度提升了 5 倍。Oracle 团队不仅机智地实现了该算法,还在 CPU 级别进行了优化。
本文将用即使是零经验的程序员也能理解的简单语言,解释 Orasort 算法。
该算法的专利由 Mark Callaghan 注册。
在 2024 年达到 20 年期限后,Orasort 的专利自动过期并进入公有领域。
我们将看到这个算法是如何工作的,像 AWS 这样的云公司和开源社区从中获得了哪些好处,以及其他重要内容。
在理解 Orasort 如何工作之前,我们需要了解传统排序是如何工作的,以及它如何影响 Oracle 的性能。
## 传统排序在 DBMS 中的工作方式
### 逐字符排序
在传统的排序算法中,一个字符串中的每个字符都与另一个字符串中对应的字符进行比较。
两个字符串之间逐字符进行排序。
它不仅仅根据第一个字符排序(例如以 'A' 开头的值);数据库还需要对以 'A' 开头的值内部进行排序。
考虑以下示例。
有两个以 'A' 开头的值:
Apple
Amazon
现在,这两个单词之间的排序开始。
这两个单词中 'A' 相同。
现在需要检查第二个字符。'P' 与 'M' 比较,由于 M < P,因此根据第二个字符做出决定。
现在,升序顺序为:
Apple
Amazon
上面的比较很简单;DBMS 只需比较两个字符。
现在考虑第二个示例。
Applet
Apples
这里,比较将持续到最后一个字符,升序顺序为:
Apples
Applet
现在考虑以下示例。
Apple is good
Apple is bad
这里,比较将消耗更多的 CPU 周期。
升序顺序为:
Apple is bad
Apple is good
这就是传统排序的工作方式。
我们可以想象这有多耗时。
## Orasort 作为救星出现
传统排序方法使用逐字符比较,简而言之,就是 1 字节比较。
Orasort 提出了一个非常聪明的想法,Oracle 团队利用 CPU 寄存器。
CPU 寄存器通常是 8 字节大小,如果 Oracle 从两个字符串中各提取 8 字节进行比较,那么比较需要的寄存器和 CPU 周期更少。
Oracle 从两个值中提取前 8 个字节,并将这些字节转换为 64 位整数。
然后,每个值变成一个 64 位整数,正在比较的另一个值也执行相同的过程。
如果能够做出决定,比较就停止。否则,取出接下来的 8 个字节,比较继续。
#### **订阅我们,永久免费获取内容。**
## Orasort 提供的好处
### 开源数据库
自公开以来,Orasort 为开源社区带来了巨大的好处。
包括 MySQL 和 PostgreSQL 在内的开源数据库已经集成了 Orasort 并正在进行实验。
### 降低云计算成本
公司使用云服务开展业务。Orasort 由于需要更少的 CPU 周期,降低了运营成本。
## Orasort 的高级流程
### 键提取与规范化
假设一个表有 1 万条记录,并且选择了名为 'email' 的列进行排序。
那么,1 万条记录将被加载到 RAM 的缓冲区中。
但是,这些记录并非以其所有值的形式获取;而是为每条记录生成键和 ID。
这些记录被加载到排序区,排序在此进行。
现在,我们之前讨论的 Orasort 过程就在这个排序区(RAM 的一部分)中发生。
但是,如果记录达到数百万条呢?Oracle 无法将所有记录指针加载到缓冲区中。
在这种情况下,Oracle 将数据分成多个部分并保存在磁盘上以备后续使用。然后它将这些部分逐个调入 RAM。
### 将排序后的数据写回磁盘
写入是一个异步任务,Oracle 不会采取一次性写入所有排序数据的方法。
它使用一种中间写入方法,即在 Orasort 仍在运行时持续写入。当写入完成时,最终的合并发生在磁盘上。
##### *DSS 不是一个普通的科技博客;我们研究开源项目,扮演科技记者的角色,并向你呈现几乎任何技术平台的深度技术信息。请考虑订阅我们。我们正在建设一个社区,在这里你将永久免费获取此类文章。*
相似文章
公共前缀跳过与自适应排序
本文描述了一项已过期的专利,涉及一种新的内存排序算法,该算法具备公共前缀跳过、自适应性和关键子串缓存等特性,已在Oracle 10gR2中实现,并显著提升了性能。
SQLite 通过预排序提升性能
本文展示了在将随机数据插入 SQLite 之前进行预排序,可以利用 B+ 树的顺序特性并减少页分裂,从而将插入性能提升 2-3 倍。
@Greptime: GreptimeDB 的扁平格式查询现在可以在任何列上预过滤——标签、字段、时间戳——而不仅仅是主键。而…
GreptimeDB 的扁平格式查询现在支持在任何列(标签、字段、时间戳)上预过滤,而不仅仅是主键,性能提升高达 4.5 倍。此外,mito2 存储引擎移除了其遗留扫描路径,清理了约 1800 行代码。
无分支快速排序:性能超越 std::sort 和 pdqsort,提供 C 和 C++ API
一种新的无分支快速排序实现(blqsort)借助排序网络技术,在 Apple M1 和 AMD Ryzen 系统上的性能超越了 std::sort 和 pdqsort,以单头文件形式提供 C 和 C++ 库。其性能提升得益于无分支分区、中位数之中位数枢轴选择以及针对小数组的自定义排序网络。
@Greptime: GreptimeDB v1.1.0 发布,PromQL rate/increase 查询速度提升高达97%,整体查询时间降低20-40%,TS… 上速度提升高达4.5倍
GreptimeDB v1.1.0 已发布,提供高达97%的PromQL查询加速,整体查询时间降低20-40%,在TSBS扫描密集型查询上性能提升高达4.5倍,并支持对现有表进行在线重分区。