Aurora PostgreSQL中jsonb_path_match与@@运算符的GIN索引使用差异疑问
PostgreSQL jsonb_path_match与@@运算符差异及索引命中问题说明
核心差异
- 实现定位不同:
jsonb_path_match是独立的内置SQL函数,接收JSONB值和jsonpath表达式两个入参,返回布尔匹配结果,属于函数调用类过滤逻辑。@@是PostgreSQL为JSONB类型原生设计的jsonpath匹配运算符,属于语法层面的运算符实现,内部已和JSONB GIN索引的查询逻辑做了绑定适配。 - 索引适配性不同:默认的JSONB列级GIN索引仅支持官方定义的可索引运算符,
@@属于明确纳入支持范围的运算符,而jsonb_path_match作为普通函数,默认未和GIN索引的操作符族绑定,优化器不会将该函数调用和已创建的列级GIN索引关联。
未命中索引的原因
你的使用语法不存在错误,未走索引是PostgreSQL优化器的固有逻辑导致:
PostgreSQL查询优化器仅会为绑定了对应索引操作符族的可索引运算符生成索引扫描计划,对于普通函数调用形式的过滤条件,除非额外创建对应的表达式索引,否则优化器会默认执行全表扫描,逐行计算函数返回值做过滤。
你当前创建的是JSONB列的普通GIN索引,仅适配@>、@@、?这类JSONB内置可索引运算符,无法匹配jsonb_path_match的函数调用请求。如果必须使用jsonb_path_match实现需求,需要额外创建对应表达式索引:
CREATE INDEX index_jsonb_path_expr ON schemanm.tblname USING gin (jsonb_path_match(colname, '($.colname.system == "X" ||$.colname.system == "Y") && $.colname.attra == "attrvala" && $.colname.attrb == "aatrvalb"'::jsonpath)) TABLESPACE pg_default;
但该类表达式索引仅能匹配固定的jsonpath表达式,灵活性远低于列级GIN索引,更推荐直接使用@@运算符的写法。
内容的提问来源于stack exchange,提问作者Balaji Govindan
相关产品推荐
相关产品推荐

