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