0

我们有两个不同的应用程序将使用我的搜索表。它们有两个不同的过滤器,它们将始终被应用,并且对于每个应用程序都是不同的。所以我创建了一个如下所示的部分索引,以便过滤器已应用于索引中。创建索引的列是 JSONB 列。

CREATE INDEX search_text_ndx_1 ON x_search_ms.x_search_tbl USING gin(x_details)
WHERE x_details @@ '($.c_data.sub_data == "A" ||$.c_data.sub_data == "B")
&& $.c_data.details.flag == "Z"'

CREATE INDEX search_text_ndx_2 ON x_search_ms.x_search_tbl USING gin(x_details)
WHERE x_details @@ '($.c_data.sub_data == "D" ||$.c_data.sub_data == "E")
&& $.c_data.details.flag == "Y"'

表中总共有大约 400K 行,我知道应用上述过滤器将使每个索引的满足行数几乎减半(即)大约 200K 行满足 search_text_ndx_1 的条件和 200K 行满足 search_text_ndx_2

但是,即使这些部分索引在查询中指定了过滤器,在进行如下检查时也不会使用这些部分索引。

explain analyze select * from x_search_ms.x_search_tbl 
where  x_details @@ '($.c_data.sub_data == "A" ||$.c_data.sub_data == "B")
&& $.c_data.details.flag == "Z"
&& $.c_data.sub_data.flag == "X flag"
&& $.c_data.filter_a == "a_value"
&& $.c_data.filter_b == "b_value" 
&& $.c_data.filter_c[*] == "c_value"'

但是他们在创建为单个索引时使用 GIN 索引,如下所示

CREATE INDEX search_text_ndx_2 ON x_search_ms.x_search_tbl USING gin(x_details)

不确定为什么查询不使用部分索引

我正在尝试的版本是 PostgreSQL 12.7

4

1 回答 1

0

部分索引代码不理解 jsonpath 的内部语义。您需要将两个@@与两个不同的 jsonpath 字符串(一个与用于定义索引的字符串匹配)并AND在 SQL 中一起使用,以便系统了解可以使用索引。

于 2021-09-18T15:06:16.047 回答