【问题标题】:How does one add a partial index checking for NULL to a JSON column on Postgres?如何在 Postgres 上的 JSON 列中添加对 NULL 的部分索引检查?
【发布时间】:2016-06-02 05:13:57
【问题描述】:

我在 Postgres 上有一个名为 datajson 列,我想添加一个仅适用于该列为 null 的行的部分索引 - 我基本上需要找到所有行其中datanull,所以我可以将一些数据放入其中。

尝试添加索引会导致缺少运算符类的错误,因为我们无法使用btree 索引来索引json 类型。但我也不想为特定属性编制索引,让我使用data->>property。如何仅索引其中包含 json null 的行?

编辑:jsonb 建议可行,但我在这个项目上坚持使用 9.3。

【问题讨论】:

    标签: json postgresql indexing


    【解决方案1】:

    考虑使用可索引的JsonB 字段。

    jsonjsonb 的主要区别在于效率。 json 类型就像一个“源代码”(文本形式),必须在每次执行时进行解析;而jsonb 数据就像一个“编译表单”,处理/读取速度要快得多,但在插入操作期间会稍微慢一些。

    jsonb 还支持索引,这可能是一个优势。一旦它被编入索引,您就可以在SELECT * FROM mytable WHERE myjsonfield IS NULL; 中使用它,我相信这就是您想要实现的目标。

    更新(Postgres 9.3)

    由于jsonb 是不可能的(对于那个版本),解决方法是索引“转换”列吗?例如:

    CREATE TABLE myjsontable (
      idfield integer NOT NULL,
      myjsonfield json,
      CONSTRAINT myjsontable_pkey PRIMARY KEY (idfield)
    );
    -- Create an index of the myjsonfield converted to the text field.
    CREATE INDEX ON myjsontable ((myjsonfield::text));
    
    SELECT * FROM myjsontable WHERE myjsonfield::TEXT IS NULL;
    

    这也可以,因为底层 json 数据类型也是 text 数据类型,因此对性能的影响非常小。

    【讨论】:

    • 应该提到,我被困在 Postgres 9.3 上 :(
    • 用 Postgres 9.3 的解决方法更新了答案。希望有帮助。 p/s:对于小(测试)表,可以通过执行 SET ENABLE_SEQSCAN = FALSE; 来确认索引正在被使用; (单独)在 SELECT 语句上按 SHIFT+F7 之前。之后记得将其设置回 TRUE。
    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2012-09-06
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多