gin/jsonb_ops (family)
GIN 操作符家族 containing 1 classes, 6 operator strategies and 5 support functions in this source build。
当前查看 PostgreSQL 18.6。
说明
GIN 操作符家族 containing 1 classes, 6 operator strategies and 5 support functions in this source build。
- 对象种类
- 操作符家族
- 索引访问方法
- GIN
用法
gin/jsonb_ops操作符类与家族
一个索引定义可以为索引的每一列指定一个 操作符类 。
操作符类标识该索引在该列上要使用哪些操作符。例如,类型 int4 上的一个 B-树索引会使用 int4_ops 类;这个操作符类包含对 int4 值进行比较所需的函数。实践中,列数据类型的默认操作符类通常已经足够。之所以存在操作符类,主要是因为对某些数据类型来说,可能存在多种有意义的索引行为。例如,我们可能希望按绝对值排序一种复数数据类型,也可能希望按实部排序。我们可以通过为该数据类型定义两个操作符类,并在创建索引时选择合适的那个来做到这一点。操作符类决定了基础排序顺序(之后还可以通过添加排序选项 COLLATE 、 ASC / DESC 和/或 NULLS FIRST / NULLS LAST 来修改)。
除了默认操作符类之外,还有一些内置操作符类:
专题手册说明
对于这些运算符,GIN 索引会从 jsonpath 模式中提取 accessors_chain == constant 形式的子句,并根据其中提到的键和值进行索引搜索。访问器链可以包含 . key、[*] 和 [ index ] 访问器。jsonb_ops 运算符类还支持 .* 和 .** 访问器,而 jsonb_path_ops 运算符类不支持。
虽然 jsonb_path_ops 操作符类只支持带有 @> 、 @? 和 @@ 操作符的查询,但相较于默认操作符类 jsonb_ops ,它具有显著的性能优势。 jsonb_path_ops 索引通常比相同数据上的 jsonb_ops 索引小得多,而且搜索也更有针对性,尤其是在查询中包含数据里频繁出现的键时。因此,搜索操作通常比使用默认操作符类时性能更佳。
jsonb_ops 与 jsonb_path_ops GIN 索引之间的技术差异在于,前者会为数据中的每个键和值分别创建独立的索引项,而后者只会为数据中的每个值创建索引项。 [7] 基本上,每个 jsonb_path_ops 索引项都是该值连同通向该值的键一起计算出的 hash。例如,要索引 {"foo": {"bar": "baz"}} ,会创建一个单独的索引项,其 hash 值中同时纳入 foo 、 bar 和 baz 这三者。因此,查找这一结构的包含查询会得到一次非常精确的索引搜索;但完全没有办法据此找出 foo 是否作为键出现。另一方面, jsonb_ops 索引会分别创建三个索引项来表示 foo 、 bar 和 baz ;然后为了执行包含查询,它会查找包含这三个项的行。尽管 GIN 索引可以相当高效地执行这种 AND 搜索,但它仍然会比等效的 jsonb_path_ops 搜索更不精确、也更慢,尤其是在包含这三个索引项中任意一个的行数非常多时。
家族中的操作符策略
| 操作符重载 | 策略 | 用途 | 排序家族 | 成员范围 | 源码说明 |
|---|---|---|---|---|---|
| @>(jsonb,jsonb) | 7 | 搜索 | 家族成员 | 包含 | |
| ?(jsonb,text) | 9 | 搜索 | 家族成员 | 键存在 | |
| ?|(jsonb,_text) | 10 | 搜索 | 家族成员 | 任一键存在 | |
| ?&(jsonb,_text) | 11 | 搜索 | 家族成员 | 所有键均存在 | |
| @?(jsonb,jsonpath) | 15 | 搜索 | 家族成员 | jsonpath 存在性检查 | |
| @@(jsonb,jsonpath) | 16 | 搜索 | 家族成员 | jsonpath 匹配 |
家族支持函数
| 支持函数编号 | 左侧类型 | 右侧类型 | 函数签名 | 返回类型 |
|---|---|---|---|---|
| 1 | jsonb | jsonb | gin_compare_jsonb(text,text) | int4 |
| 2 | jsonb | jsonb | gin_extract_jsonb(jsonb,internal,internal) | 内部 |
| 3 | jsonb | jsonb | gin_extract_jsonb_query(jsonb,internal,int2,internal,internal,internal,internal) | 内部 |
| 4 | jsonb | jsonb | gin_consistent_jsonb(internal,int2,jsonb,int4,internal,internal,internal,internal) | bool |
| 6 | jsonb | jsonb | gin_triconsistent_jsonb(internal,int2,jsonb,int4,internal,internal,internal) | char |
本家族的操作符类
相关条目
文档与源码
- Matching PostgreSQL source archive
- PostgreSQL 18 English manual: indexes-opclass.html
- PostgreSQL 18 English manual: catalog-pg-opfamily.html
- PostgreSQL 18 English manual: catalog-pg-amop.html
- PostgreSQL 18 English manual: catalog-pg-amproc.html
- PostgreSQL 18 English manual: datatype-json.html
来源构建
- 版本
- 18.6
- 构建
- https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
- 来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
版本比较
PostgreSQL 11 → 12: 属性变化。
以下差异保留原始字段名与英文源描述。
--- PostgreSQL 11
+++ PostgreSQL 12
@@ -44,6 +44,26 @@
"right_type": "jsonb",
"sort_family": "",
"strategy": "7"
+ },
+ {
+ "family": "jsonb_ops",
+ "left_type": "jsonb",
+ "method": "gin",
+ "operator": "@?(jsonb,jsonpath)",
+ "purpose": "search",
+ "right_type": "jsonpath",
+ "sort_family": "",
+ "strategy": "15"
+ },
+ {
+ "family": "jsonb_ops",
+ "left_type": "jsonb",
+ "method": "gin",
+ "operator": "@@(jsonb,jsonpath)",
+ "purpose": "search",
+ "right_type": "jsonpath",
+ "sort_family": "",
+ "strategy": "16"
},
{
"family": "jsonb_ops",
比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。
相关条目
导出 JSON · 返回运算符族 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。