我有一个超过25M记录的Postgres表,我有一个名为info的jsonb列。
示例json格式:
{
"username1":{"name":"somename","age":22,"gender":"male"},
"fathername":{"name":"somename","age":22,"gender":"male"}
}
我将找到与'user%'键值匹配的记录数。
这是我的查询
select count(1) from tablename where info::text like '%user%';
此查询正在运行,我正在获取结果,但是需要很长时间才能在25M记录中执行此查询。
有什么方法可以优化此查询或任何其他方法来实现它?请帮忙。
提前致谢!
答案 0 :(得分:0)
正如@klin所指出的那样,这个查询只会给你0:
select count(1) from tablename where info::text like 'user%';
为什么,因为这只是一个简单的模式匹配,并且您的信息栏中没有任何字符串以' user'开头。对于'%user%'你可能会有更好的运气但这将非常慢(除非您启用了trigram扩展并创建了索引)
如果您想准确计算username1
设置了多少用户,那么这是一个非常简单的查询。
select count(1) from tablename where info ? 'username1'
这适用于9.5。如果你有一个有限数量的用户%'关键字,您可以尝试这样的事情:
select count(1) from tablename where info ?| array['username1','username2',..]
如果您不确定按键的性质,那么您可以
SELECT COUNT(1) FROM (
SELECT * FROM JSONB_EACH(info) FROM tablename
) AS a WHERE a.key like '%user%'
答案 1 :(得分:0)
嗯,它看起来很难看,但我认为这可行:
select count(1) from (
-- unnest an array of keys
select id, unnest(array_agg(d.k)) as k from (
-- extract info keys
select id, jsonb_object_keys(info) as k from tablename
) as d
where k like '%user%'
group by id
) as q
group by id;