丹尼尔·维里特:探讨PostgreSQL 17中新内置排序规则提供者

丹尼尔·维里特:探讨PostgreSQL 17中新内置排序规则提供者

💡 原文英文,约2500词,阅读约需9分钟。
📝

内容提要

PostgreSQL 17引入了内置的UTF-8区域设置和二进制字符串比较的排序规则。新的排序规则是不可变的,并保证在不同系统上具有一致的排序语义。它支持完整的Unicode字符分类,并提供快速、与操作系统无关的二进制排序。新的排序规则在索引和搜索操作中表现出更快的性能。然而,它不像语言排序规则那样以“人类方式”对字符串进行排序。文章提供了使用新的排序规则的说明,并讨论了它的优点和局限性。

🔎

延伸解读

新排序规则的核心优势

PostgreSQL 17 引入的内置排序规则提供者,其 C.UTF-8 区域设置和 pg_c_utf8 排序规则结合了多项优势:不可变性确保跨系统排序结果一致;二进制比较带来更快的索引和搜索性能;完整的 Unicode 字符分类支持所有字母表的大小写转换和正则表达式。与 libc 和 ICU 提供者相比,它同时实现了操作系统无关性、快速二进制排序和 Unicode 分类,适合作为 Unicode 数据库的默认设置。

性能表现与优化建议

在 IMDb 数据集的测试中,新排序规则在索引创建和查询执行上均优于语言排序规则。libc 的 en_US.utf8 最慢,ICU 的 en-x-icu 因缩写键优化而较快,而 C 和 C.UTF-8 最快。使用 COLLATE 子句可能因缓存查找而降低性能,因此建议在数据库级别设置区域,而非在查询中使用 COLLATE。此外,二进制排序索引可直接支持左锚定搜索,无需额外的 pattern_ops 索引。

排序局限与应对策略

二进制排序的主要缺点是不按“人类方式”排序,例如带重音符号的字符会与基本字符分开。若需语言排序,可在 ORDER BY 中使用 COLLATE 子句指定语言排序规则,如 en_US.utf8 或 en-x-icu,但可能牺牲可移植性。现代客户端应用常自带排序功能,可避免依赖数据库排序。若结果集过大,数据库端排序仍是必要选择。

❓

Q&A

PostgreSQL 17的新排序规则有什么特点?

PostgreSQL 17引入了内置的UTF-8区域设置和二进制字符串比较的排序规则,确保在不同系统上具有一致的排序语义,并支持完整的Unicode字符分类。

如何在PostgreSQL 17中使用新的排序规则?

在创建数据库时,需指定locale名称为C.UTF8和提供者为'builtin',例如使用命令:CREATE DATABASE test locale_provider = 'builtin' builtin_locale = 'C.UTF8' template = 'template0';

新排序规则在性能上有什么优势?

新的排序规则在索引和搜索操作中表现出更快的性能,字节比较使用更少的CPU,性能优于语言比较。

新排序规则的主要缺点是什么?

新排序规则的主要缺点是无法以“人类方式”对字符串进行排序,导致某些字符的排序结果不符合人类的直觉。

如何在查询中实现语言排序?

可以使用COLLATE子句在查询中实现语言排序,例如:SELECT * FROM tablename WHERE columnname = 'some-value' COLLATE pg_c_utf8;

PostgreSQL 17的新排序规则与之前的排序规则有什么不同?

新排序规则提供了与C排序相似的排序语义,但支持完整的Unicode字符分类,并且是不可变的,确保在不同系统上的一致性。

🏷️

标签

➡️

继续阅读