如何提高大 table 中对 JSONB 字段的 "minus" 查询的性能?
How to improve performance of "minus" query on JSONB field in big table?
在 PostgreSQL 12.7 数据库中,我 table 有一个 JSONB 字段。 Table 有百万行。 table1
就像:
id | value
-- | --------------------------------------
1 | {"1001": "coke", "1002": "soda"}
2 | {"2001": "fanta", "1001": "coke"}
3 | {"3001": "beer", "2001": "fanta"}
每当我需要删除项目 1001 时,我有这样的查询:
查询 1:
UPDATE table1 set value = value - '1001'
查询 2:
UPDATE table1 set value = value - '1001' WHERE value ? '1001'
查询 2 大约需要 2 秒,查询 1 大约需要 20 秒。我正在寻找提高四分之一秒更新速度的方法。
支持带索引的查询2。喜欢:
CREATE INDEX ON table1 USING gin (value);
default GIN operator class for jsonb
支持 ?
运算符。
虽然只有很少行受到影响,但应该非常有效。如果更改了所有行的主要百分比,索引将无济于事(实际上会增加成本)。
在 PostgreSQL 12.7 数据库中,我 table 有一个 JSONB 字段。 Table 有百万行。 table1
就像:
id | value
-- | --------------------------------------
1 | {"1001": "coke", "1002": "soda"}
2 | {"2001": "fanta", "1001": "coke"}
3 | {"3001": "beer", "2001": "fanta"}
每当我需要删除项目 1001 时,我有这样的查询:
查询 1:
UPDATE table1 set value = value - '1001'
查询 2:
UPDATE table1 set value = value - '1001' WHERE value ? '1001'
查询 2 大约需要 2 秒,查询 1 大约需要 20 秒。我正在寻找提高四分之一秒更新速度的方法。
支持带索引的查询2。喜欢:
CREATE INDEX ON table1 USING gin (value);
default GIN operator class for jsonb
支持 ?
运算符。
虽然只有很少行受到影响,但应该非常有效。如果更改了所有行的主要百分比,索引将无济于事(实际上会增加成本)。