And*_*ers 2 postgresql index json
我在 PostgreSQL 中使用 jsonb 类型。我经常进行以下类型的更新(jdocjsonb 列在哪里):
UPDATE my_table SET jdoc = jdoc || '{a: "Hello World!"}'::jsonb WHERE id = 123
Run Code Online (Sandbox Code Playgroud)
我在 jsonb 列上有许多表达式索引:
CREATE INDEX ix_b ON my_table some_function(jdoc->>b)
CREATE INDEX ix_c ON my_table some_other_function(jdoc->>c)
Run Code Online (Sandbox Code Playgroud)
如您所见,我只更改了jdoc->a,但我必须设置整个jdoc列。因此,我是否会因更新索引jdoc->b而遭受全部性能损失jdoc->c?或者 PostgreSQL 足够聪明以注意到这些值没有改变,因此索引不需要更新?如果我遭受了全部的性能损失,有没有办法避免它?
因此,我是否会因更新 jdoc->b 和 jdoc->c 上的索引而遭受全部性能损失?
是的。
或者 PostgreSQL 是否足够聪明以注意到这些值没有改变,因此索引不需要更新?
不,因为索引可能确实发生了变化,您只是没有看到。
当您更新 json 文档时,PostgreSQL 会将包含它的行的新版本写入表中。表中有一个新行,旧行被标记为有效删除。(这并不是说简单的,但是这是不够好。)新行都有一个新的地址,以及指标需要进行更新,以指向新的行地址,即使该值的指数可能是完全一样的。
PostgreSQL 有一些优化,可以在少数情况下避免此类索引更新(如果您想了解详细信息,请阅读 HOT),但如果您要更新索引列,则它们无济于事。
如果我遭受了全部的性能损失,有没有办法避免它?
不,没有。您必须将 json 文档分成两列。
这不会随着 9.6 对更新 json 文档的新支持而改变。它仍然会将整个更新的文档作为新元组写入新的 TOASTed 字段,这将需要索引更新。创建新的 json 文档更有效,但不会更快(或更小)更新将其写入磁盘和索引。
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |