Fix: faster wildcard queries for JSONB fields #943
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Your checklist for this pull request
What is the current behaviour?
JSONB wildcard queries are very slow because there is no supported JSONB "LIKE" operator that works with current implementation of GIN index. In the same time, LIKE on
jsonb_path_query
function result is very expensive.So queries like:
may take minutes, especially when matching rows are really far in config table, which is far more than usual request timeout setting.
What is the new behaviour?
Configs are too long to be indexed by simple btree, but we found that simple
object.cfg::text LIKE "%...%"
works much faster even if it performs a full table scan. It's not exactly what we want if we use key predicate (cfg.urls:*/content/*
) so it's still combined with the originaljsonb_path_query
-based solution with hope that PostgreSQL will use simple LIKE to pre-filter the rows before using function-based query. On our database data it usually does.In future PRs I plan to optimize it further to avoid full scan at all.
Test plan
Closing issues