如何索引 Jsonb 字段

How to Index Jsonb Field

{
    "Data": [
        {
            "Id": "4321ecb0-5426-4369-a9ed-851de87c3337",
            "Foo": {
                "Id": "1474bcac-3711-4063-8d25-6491122927f2",
                ...
            },
            ...
        }
    ]
}

我在数据库中有一个 jsonb 列 C(上面显示了其中的数据示例),因此我使用 C# 和 Entity Framework 核心来查询此结构。我已经在文本列 A 和日期列 B 上有了索引。

"select * from "T" where "A" = 'Some Text' and "C"->'Data' @> '[{"Id":" + theId + "}]' order by "B" desc"

在此查询中,我要搜索的 ID 是对象 Foo 中的 ID。此查询有效但速度很慢,因为我在 id 上没有任何索引。我不知道如何在 Foo 对象的 id 列上添加索引。任何帮助将不胜感激。

你应该改变条件

"C"->'Data' @> '[{"Id":" + theId + "}]'

"C" @> '{"Data": [{"Id":" + theId + "}]}'

并在列上使用 GIN 索引:

CREATE INDEX ON "T" USING gin ("C");

根据查询的编写方式,您可能会受益于“C”部分的索引。

create index on "T" using gin (("C"->'Data'));

如果稍微重写查询,您可以在“C”本身的顶层使用 GIN 索引:

... AND "C" @> '{"Data":[{"Id":"1474bcac-3711-4063-8d25-6491122927f2"}]}'...

但我认为这与此查询的第一个索引相比没有任何优势,但它可能更灵活,因此可用于您可能还想 运行 但您没有的不同查询t显示。

如果“A”测试足够有选择性,您最好根本不在 JSONB 字段上使用任何索引,而只是索引 on "T" ("A","B") 并让 JSONB 条件作为过滤器应用而不是比索引。