PostgreSQL 13.3数据表
CREATE TABLE transaction (message jsonb NOT NULL);
INSERT INTO transaction(message) VALUES ('{"amount": 1.00}'), ('{"amount": 2.00}');
字符串
该指数
CREATE INDEX ON transaction (((message->'amount')::numeric));
型
用于查询
SELECT t.message FROM transaction t
WHERE (t.message->'amount')::numeric > 1.00;
型
两个索引都没有
CREATE INDEX ON transaction USING GIN (message);
CREATE INDEX ON transaction USING GIN (message jsonb_path_ops);
型
用于查询
SELECT t.message FROM transaction t
WHERE t.message @@ format('$.amount > %s', 1.00)::jsonpath;
型
在PostgreSQL中是否有一种方法来索引transaction.message
列,以便JSONPath @@
操作符使用索引而不是进行Seq Scan?
1条答案
按热度按时间kmb7vmvb1#
我认为表中没有足够的行供索引使用。请禁用会话的顺序扫描或尝试以下操作
字符串
现在使用索引
型
返回
型
它仍然选择顺序扫描,
型
这可能是因为计划者在统计数据中看到太多> 1.00的值。
问题的第二部分
型
返回
型
所以这个索引将在可以使用的时候使用,特别是在这个例子中,jsonpath是
t.message @@ '$.amount == 1.00'
。正如@Bergi在下面的评论中指出的那样,问题的第二部分特别询问了
t.message @@ '$.amount > 1.00'
。我不能假装我知道肯定,但我有一种感觉,索引只存储有关路径的信息,这意味着明确存在的东西,并且对这种比较没有帮助。但这只是一个猜测。我没有看到它用于==
以外的任何东西。